|  | @ -1,8 +1,12 @@
 | 
												
													
														
															|  | package com.yihu.jw.gateway.filter;
 |  | package com.yihu.jw.gateway.filter;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | import com.alibaba.fastjson.JSONObject;
 | 
												
													
														
															|  | import com.fasterxml.jackson.databind.ObjectMapper;
 |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
												
													
														
															|  | import com.netflix.zuul.ZuulFilter;
 |  | import com.netflix.zuul.ZuulFilter;
 | 
												
													
														
															|  | import com.netflix.zuul.context.RequestContext;
 |  | import com.netflix.zuul.context.RequestContext;
 | 
												
													
														
															|  | 
 |  | import com.netflix.zuul.http.HttpServletRequestWrapper;
 | 
												
													
														
															|  | 
 |  | import com.netflix.zuul.http.ServletInputStreamWrapper;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.gateway.AesEncryptUtils;
 | 
												
													
														
															|  | import com.yihu.jw.gateway.methlog.BaseLoginLogService;
 |  | import com.yihu.jw.gateway.methlog.BaseLoginLogService;
 | 
												
													
														
															|  | import com.yihu.jw.gateway.methlog.BaseMethodLogService;
 |  | import com.yihu.jw.gateway.methlog.BaseMethodLogService;
 | 
												
													
														
															|  | import com.yihu.jw.gateway.useragent.UserAgent;
 |  | import com.yihu.jw.gateway.useragent.UserAgent;
 | 
												
											
												
													
														
															|  | @ -20,16 +24,20 @@ import org.springframework.security.oauth2.provider.OAuth2Authentication;
 | 
												
													
														
															|  | import org.springframework.security.oauth2.provider.token.TokenStore;
 |  | import org.springframework.security.oauth2.provider.token.TokenStore;
 | 
												
													
														
															|  | import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
 |  | import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
 | 
												
													
														
															|  | import org.springframework.stereotype.Component;
 |  | import org.springframework.stereotype.Component;
 | 
												
													
														
															|  | 
 |  | import org.springframework.util.StreamUtils;
 | 
												
													
														
															|  | import org.springframework.util.StringUtils;
 |  | import org.springframework.util.StringUtils;
 | 
												
													
														
															|  | import org.springframework.web.multipart.MultipartFile;
 |  | import org.springframework.web.multipart.MultipartFile;
 | 
												
													
														
															|  | import org.springframework.web.multipart.MultipartHttpServletRequest;
 |  | import org.springframework.web.multipart.MultipartHttpServletRequest;
 | 
												
													
														
															|  | import org.springframework.web.multipart.MultipartResolver;
 |  | import org.springframework.web.multipart.MultipartResolver;
 | 
												
													
														
															|  | import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 |  | import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | import javax.servlet.ServletInputStream;
 | 
												
													
														
															|  | import javax.servlet.http.HttpServletRequest;
 |  | import javax.servlet.http.HttpServletRequest;
 | 
												
													
														
															|  | import java.io.IOException;
 |  | import java.io.IOException;
 | 
												
													
														
															|  | import java.util.Enumeration;
 |  | 
 | 
												
													
														
															|  | import java.util.Iterator;
 |  | 
 | 
												
													
														
															|  | 
 |  | import java.io.InputStream;
 | 
												
													
														
															|  | 
 |  | import java.net.URLEncoder;
 | 
												
													
														
															|  | 
 |  | import java.nio.charset.Charset;
 | 
												
													
														
															|  | 
 |  | import java.util.*;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | /**
 |  | /**
 | 
												
													
														
															|  |  * Created by progr1mmer on 2017/12/27.
 |  |  * Created by progr1mmer on 2017/12/27.
 | 
												
											
												
													
														
															|  | @ -68,6 +76,7 @@ public class BasicZuulFilter extends ZuulFilter {
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     @Override
 |  |     @Override
 | 
												
													
														
															|  |     public boolean shouldFilter() {
 |  |     public boolean shouldFilter() {
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         return true;
 |  |         return true;
 | 
												
													
														
															|  |     }
 |  |     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
											
												
													
														
															|  | @ -89,9 +98,27 @@ public class BasicZuulFilter extends ZuulFilter {
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         logger.info("BasicZuulFilter:"+url);
 |  |         logger.info("BasicZuulFilter:"+url);
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |         if (!(url.contains("/open/noLogin/notify")||
 | 
												
													
														
															|  | 
 |  |             url.contains("/open/noLogin/ylzReceiveNotify")||
 | 
												
													
														
															|  | 
 |  |             url.contains("/open/noLogin/receiveNotify")||
 | 
												
													
														
															|  | 
 |  |             url.contains("/open/noLogin/getSFExpressInfoNew")||
 | 
												
													
														
															|  | 
 |  |             url.contains("/open/noLogin/sfroutepushservice")||
 | 
												
													
														
															|  | 
 |  |             url.contains("/open/noLogin/ylzSettleRecord")||
 | 
												
													
														
															|  | 
 |  |                 url.contains("/weixin"))){
 | 
												
													
														
															|  | 
 |  |             logger.info("入参"+ctx.getRequestQueryParams());
 | 
												
													
														
															|  | 
 |  |             try {
 | 
												
													
														
															|  | 
 |  |                 decrypt(ctx,request);
 | 
												
													
														
															|  | 
 |  |                 logger.info("第一步");
 | 
												
													
														
															|  | 
 |  |             } catch (Exception e) {
 | 
												
													
														
															|  | 
 |  |                 e.printStackTrace();
 | 
												
													
														
															|  | 
 |  |             }
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         //保存操作日志
 |  |         //保存操作日志
 | 
												
													
														
															|  |         baseMethodLogService.saveMethodLog(request);
 |  |         baseMethodLogService.saveMethodLog(request);
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         //内部微服务有不需要认证的地址请在URL上追加/open/来进行过滤,如/api/v1.0/open/**,不要在此继续追加!!!
 |  |         //内部微服务有不需要认证的地址请在URL上追加/open/来进行过滤,如/api/v1.0/open/**,不要在此继续追加!!!
 | 
												
													
														
															|  |         if (url.contains("/auth/")//验证服务
 |  |         if (url.contains("/auth/")//验证服务
 | 
												
													
														
															|  |                 || url.contains("/base/wechat")//微信
 |  |                 || url.contains("/base/wechat")//微信
 | 
												
											
												
													
														
															|  | @ -111,6 +138,67 @@ public class BasicZuulFilter extends ZuulFilter {
 | 
												
													
														
															|  |         return this.authenticate(ctx, request, url);
 |  |         return this.authenticate(ctx, request, url);
 | 
												
													
														
															|  |     }
 |  |     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     public void decrypt(RequestContext ctx,HttpServletRequest request) throws Exception {
 | 
												
													
														
															|  | 
 |  |         String method = request.getMethod();
 | 
												
													
														
															|  | 
 |  |         if (method.equalsIgnoreCase("GET")){
 | 
												
													
														
															|  | 
 |  |             Map<String, List<String>> map = ctx.getRequestQueryParams();
 | 
												
													
														
															|  | 
 |  |             String aes_decodedStr = AesEncryptUtils.decrypt(map.get("object").toString());
 | 
												
													
														
															|  | 
 |  |             JSONObject object = JSONObject.parseObject(aes_decodedStr);
 | 
												
													
														
															|  | 
 |  |             for(String str:object.keySet()){
 | 
												
													
														
															|  | 
 |  |                 List<String> arrayList = new ArrayList<>();
 | 
												
													
														
															|  | 
 |  |                 String value = object.getString(str);
 | 
												
													
														
															|  | 
 |  |                 arrayList.add(value);
 | 
												
													
														
															|  | 
 |  |                 map.put(str,arrayList);
 | 
												
													
														
															|  | 
 |  |             }
 | 
												
													
														
															|  | 
 |  |             map.remove("object");
 | 
												
													
														
															|  | 
 |  |             ctx.setRequestQueryParams(map);
 | 
												
													
														
															|  | 
 |  |             logger.info("解密后的参数"+ctx.getRequestQueryParams());
 | 
												
													
														
															|  | 
 |  |         }else if ("POST".equals(method) || "PUT".equals(method)) {
 | 
												
													
														
															|  | 
 |  |             InputStream in = request.getInputStream();
 | 
												
													
														
															|  | 
 |  |             String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
 | 
												
													
														
															|  | 
 |  |             // 如果body为空初始化为空json
 | 
												
													
														
															|  | 
 |  |             if (StringUtils.isEmpty(body)) {
 | 
												
													
														
															|  | 
 |  |                 body = "{}";
 | 
												
													
														
															|  | 
 |  |             }
 | 
												
													
														
															|  | 
 |  |             logger.info("body" + body);
 | 
												
													
														
															|  | 
 |  |             // 获取请求参数name
 | 
												
													
														
															|  | 
 |  |             String jsonString = request.getParameter("object");
 | 
												
													
														
															|  | 
 |  |             logger.info("canshu"+jsonString);
 | 
												
													
														
															|  | 
 |  |             if (jsonString != null) {
 | 
												
													
														
															|  | 
 |  |                 body="";
 | 
												
													
														
															|  | 
 |  |                 String jsonobject = AesEncryptUtils.decrypt(jsonString);
 | 
												
													
														
															|  | 
 |  |                 logger.info("解密:" + jsonobject);
 | 
												
													
														
															|  | 
 |  |                 JSONObject jsonObject = JSONObject.parseObject(jsonobject);
 | 
												
													
														
															|  | 
 |  |                 for(String str:jsonObject.keySet()){
 | 
												
													
														
															|  | 
 |  |                     String value = jsonObject.getString(str);
 | 
												
													
														
															|  | 
 |  |                     body+=str+"="+ URLEncoder.encode(value)+"&";
 | 
												
													
														
															|  | 
 |  |                 }
 | 
												
													
														
															|  | 
 |  |                 String newBody = body.substring(0,body.length()-1);
 | 
												
													
														
															|  | 
 |  |                 logger.info("newBody" + newBody);
 | 
												
													
														
															|  | 
 |  |                 final byte[] reqBodyBytes = newBody.getBytes();
 | 
												
													
														
															|  | 
 |  |                 // 重写上下文的HttpServletRequestWrapper
 | 
												
													
														
															|  | 
 |  |                 ctx.setRequest(new HttpServletRequestWrapper(request) {
 | 
												
													
														
															|  | 
 |  |                     @Override
 | 
												
													
														
															|  | 
 |  |                     public ServletInputStream getInputStream() throws IOException {
 | 
												
													
														
															|  | 
 |  |                         return new ServletInputStreamWrapper(reqBodyBytes);
 | 
												
													
														
															|  | 
 |  |                     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |                     @Override
 | 
												
													
														
															|  | 
 |  |                     public int getContentLength() {
 | 
												
													
														
															|  | 
 |  |                         return reqBodyBytes.length;
 | 
												
													
														
															|  | 
 |  |                     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |                     @Override
 | 
												
													
														
															|  | 
 |  |                     public long getContentLengthLong() {
 | 
												
													
														
															|  | 
 |  |                         return reqBodyBytes.length;
 | 
												
													
														
															|  | 
 |  |                     }
 | 
												
													
														
															|  | 
 |  |                 });
 | 
												
													
														
															|  | 
 |  |             }
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     /**
 |  |     /**
 | 
												
													
														
															|  |      * 验证token 权限地址
 |  |      * 验证token 权限地址
 | 
												
													
														
															|  |      * @param ctx
 |  |      * @param ctx
 |