From 2063d7b89f55f232d735662c84d4465f91cd51a6 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 16 Apr 2021 13:51:18 +0800 Subject: [PATCH] api --- .../controller/UserBasicInfoController.java | 8 +- .../interceptor/AuthorizationInterceptor.java | 137 +++++++++++------- .../BodyReaderHttpServletRequestWrapper.java | 25 +++- .../java/com/iformall/utils/HttpUtil.java | 59 ++++++++ 4 files changed, 174 insertions(+), 55 deletions(-) diff --git a/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java b/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java index bb782700a..f1c7c5221 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java +++ b/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java @@ -1,5 +1,6 @@ package com.iformall.controller; +import com.alibaba.fastjson.JSON; import com.iformall.common.ResultData; import com.iformall.utils.HttpUtil; import com.iformall.utils.sign.SignUtils; @@ -8,7 +9,6 @@ import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; import java.util.Date; @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; @RestController -@RequestMapping("/api/userInfo") +@RequestMapping("api/userInfo") @Api(description = "会员相关接口") public class UserBasicInfoController extends BaseController { @@ -31,7 +31,7 @@ public class UserBasicInfoController extends BaseController { */ @PostMapping("/register") @ApiOperation(value = "用户注册", notes = "") - public ResultData userRegister(@RequestBody MultiValueMap map) { + public ResultData userRegister(@RequestBody Map map) { logger.info("UserBasicInfoController >>>>>>>>>>>>>>>>>>>>>>>>>"+map.toString()); // logger.info("UserBasicInfoController >>>>>>>>phone >>>>>>>>>>>>>>>>>"+phone); @@ -59,7 +59,7 @@ public class UserBasicInfoController extends BaseController { System.out.println("sign="+sign); headMap.put("sign",sign); - String s = HttpUtil.doPost("https://openapitest.malls.iformall.com/api/api/userInfo/register", headMap, paramMap); + String s = HttpUtil.doPost("https://openapitest.malls.iformall.com/api/api/userInfo/register", headMap, JSON.toJSONString(paramMap)); System.out.println(s); diff --git a/mallinkPublicApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java b/mallinkPublicApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java index c33c2e77d..386ad8dc3 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java +++ b/mallinkPublicApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java @@ -2,6 +2,8 @@ package com.iformall.interceptor; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxThirdPartyApi; import com.iformall.exception.MallinkException; @@ -51,6 +53,8 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + response.setHeader("Content-type", "application/json;charset=UTF-8"); + String appkey = request.getHeader("appkey"); if (StringUtils.isBlank(appkey) || !appkey.contains("&")) { throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"非法请求"); @@ -68,22 +72,55 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"缺少加密串"); } + + String body = ((BodyReaderHttpServletRequestWrapper) request).getBody(); if(StringUtils.isBlank(body)){ throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"缺少参数"); } - Map param = StringToMap(body); - if(param.isEmpty()){ + try{ +// JSONObject parameterMap = JSON.parseObject(body); + Map parameterMap = JSONObject.parseObject(body, new TypeReference>() { + }); + + String timeStamp = parameterMap.get("timeStamp"); + long timestampDate = Long.valueOf(timeStamp) + 1000*60*5;//五分钟有效 + long currDate = System.currentTimeMillis(); + // 请求过期 + if (timestampDate < currDate) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"请求过期"); + } + + logger.info("sign={}"+signature); + String signKey = apiConfig.getSignKey();//TODO 根据appId查询密钥,缓存 + String newSignature = SignUtils.getSign(signKey, parameterMap, "MD5"); + //加密串不匹配 + if (!signature.equals(newSignature)) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"加密串校验失败"); + } + Integer cache = RedisCacheUtils.getCacheInteger(redisTemplate, Constant.publicApiNonce+signature); + if (null != cache) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"重复调用"); + } + RedisCacheUtils.cache(redisTemplate, Constant.publicApiNonce+signature, 1, 300); + return true; + + }catch(Exception e){ throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"参数格式不正确"); } - String timeStamp = param.get("timeStamp"); - long timestampDate = Long.valueOf(timeStamp) + 1000*60*5;//五分钟有效 - long currDate = System.currentTimeMillis(); - // 请求过期 - if (timestampDate < currDate) { - throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"请求过期"); - } +// Map param = StringToMap(body); +// if(param.isEmpty()){ +// throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"参数格式不正确"); +// } +// +// String timeStamp = param.get("timeStamp"); +// long timestampDate = Long.valueOf(timeStamp) + 1000*60*5;//五分钟有效 +// long currDate = System.currentTimeMillis(); +// // 请求过期 +// if (timestampDate < currDate) { +// throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"请求过期"); +// } // String nonceStr = param.get("nonceStr"); // //重复调用 @@ -114,49 +151,49 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { // } // } - logger.info("sign={}"+signature); - String signKey = apiConfig.getSignKey();//TODO 根据appId查询密钥,缓存 - String newSignature = SignUtils.getSign(signKey, param, "MD5"); - //加密串不匹配 - if (!signature.equals(newSignature)) { - throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"加密串校验失败"); - } - Integer cache = RedisCacheUtils.getCacheInteger(redisTemplate, Constant.publicApiNonce+signature); - if (null != cache) { - throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"重复调用"); - } - RedisCacheUtils.cache(redisTemplate, Constant.publicApiNonce+signature, 1, 300); - return true; +// logger.info("sign={}"+signature); +// String signKey = apiConfig.getSignKey();//TODO 根据appId查询密钥,缓存 +// String newSignature = SignUtils.getSign(signKey, param, "MD5"); +// //加密串不匹配 +// if (!signature.equals(newSignature)) { +// throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"加密串校验失败"); +// } +// Integer cache = RedisCacheUtils.getCacheInteger(redisTemplate, Constant.publicApiNonce+signature); +// if (null != cache) { +// throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"重复调用"); +// } +// RedisCacheUtils.cache(redisTemplate, Constant.publicApiNonce+signature, 1, 300); +// return true; } - private Map StringToMap(String body){ - Map map = new HashMap(); - String bodyDecode = ""; - try { - bodyDecode = URLDecoder.decode(body, "utf-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return map; - } - - String[] keyValues = bodyDecode.split("&"); - for (String kv:keyValues) { - if(StringUtils.isBlank(kv) || !kv.contains("=")){ - continue; - } - String[] key_value = kv.split("="); - String key = key_value[0]; - if(StringUtils.isNotBlank(key) - && !"sign".equals(key) - && !"appId".equals(key) - && !"appKey".equals(key) - && !"signKey".equals(key)){ - String value = kv.substring(kv.indexOf('=') + 1, kv.length()); - map.put(key_value[0],value); - } - } - return map; - } +// private Map StringToMap(String body){ +// Map map = new HashMap(); +// String bodyDecode = ""; +// try { +// bodyDecode = URLDecoder.decode(body, "utf-8"); +// } catch (UnsupportedEncodingException e) { +// e.printStackTrace(); +// return map; +// } +// +// String[] keyValues = bodyDecode.split("&"); +// for (String kv:keyValues) { +// if(StringUtils.isBlank(kv) || !kv.contains("=")){ +// continue; +// } +// String[] key_value = kv.split("="); +// String key = key_value[0]; +// if(StringUtils.isNotBlank(key) +// && !"sign".equals(key) +// && !"appId".equals(key) +// && !"appKey".equals(key) +// && !"signKey".equals(key)){ +// String value = kv.substring(kv.indexOf('=') + 1, kv.length()); +// map.put(key_value[0],value); +// } +// } +// return map; +// } } diff --git a/mallinkPublicApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java b/mallinkPublicApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java index 38aec3039..c9494691b 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java +++ b/mallinkPublicApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java @@ -13,7 +13,7 @@ public class BodyReaderHttpServletRequestWrapper extends XssHttpServletRequestWr StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try { - InputStream inputStream = request.getInputStream(); + InputStream inputStream = cloneInputStream(request.getInputStream()); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8")); char[] charBuffer = new char[1024]; @@ -70,6 +70,29 @@ public class BodyReaderHttpServletRequestWrapper extends XssHttpServletRequestWr return new BufferedReader(new InputStreamReader(this.getInputStream())); } + /** + * Description: 复制输入流
+ * + * @param inputStream + * @return
+ */ + public InputStream cloneInputStream(ServletInputStream inputStream) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + try { + while ((len = inputStream.read(buffer)) > -1) { + byteArrayOutputStream.write(buffer, 0, len); + } + byteArrayOutputStream.flush(); + } + catch (IOException e) { + e.printStackTrace(); + } + InputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + return byteArrayInputStream; + } + public String getBody() { return this.body; } diff --git a/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java b/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java index c5b0d52d2..6b5c32194 100644 --- a/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java +++ b/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java @@ -413,6 +413,65 @@ public class HttpUtil { return null; } + /** + * post请求(用于请求json格式的参数) + * @param url + * @param params + * @return + */ + public static String doPost(String url, Map headMap, String params){ + + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url);// 创建httpPost + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Content-Type", "application/json"); + + if(headMap != null){ + Set set = headMap.keySet(); + for(String key: set){ + httpPost.addHeader(key,headMap.get(key)); + } + } + + String charSet = "UTF-8"; + StringEntity entity = new StringEntity(params, charSet); + httpPost.setEntity(entity); + CloseableHttpResponse response = null; + + try { + response = httpclient.execute(httpPost); + StatusLine status = response.getStatusLine(); + int state = status.getStatusCode(); + if (state == HttpStatus.SC_OK) { + HttpEntity responseEntity = response.getEntity(); + String jsonString = EntityUtils.toString(responseEntity); + return jsonString; + } + else{ + logger.info("请求返回:"+state+"("+url+")"); + } + } + catch(Exception e){ + logger.error(e.getMessage()); + return null; + } + finally { + if (response != null) { + try { + response.close(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } + try { + httpclient.close(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } + return null; + } + public static String payPost(String url, String params) { RequestBody body = RequestBody.create(CONTENT_TYPE_FORM, params);