From 3801d2f7b7e100721558ed3a8094407f50dc6c97 Mon Sep 17 00:00:00 2001 From: we6288815 Date: Tue, 18 May 2021 10:31:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=81=9A=E5=90=88=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=BC=BA=E5=A4=B1=E5=AE=9E=E9=99=85=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E7=A0=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 2 +- .../knife4j/aggre/core/RouteDispatcher.java | 229 ++++++++++-------- knife4j/knife4j-annotations/pom.xml | 2 +- knife4j/knife4j-core/pom.xml | 2 +- knife4j/knife4j-dependencies/pom.xml | 4 +- knife4j/knife4j-jfinal-ui/pom.xml | 2 +- knife4j/knife4j-jfinal/pom.xml | 2 +- .../knife4j-micro-spring-boot-starter/pom.xml | 2 +- .../knife4j-spring-boot-autoconfigure/pom.xml | 2 +- knife4j/knife4j-spring-boot-starter/pom.xml | 2 +- knife4j/knife4j-spring-mvc/pom.xml | 2 +- knife4j/knife4j-spring-ui/pom.xml | 2 +- knife4j/knife4j-spring/pom.xml | 2 +- knife4j/knife4j-springdoc-ui/pom.xml | 2 +- knife4j/pom.xml | 4 +- 15 files changed, 140 insertions(+), 121 deletions(-) diff --git a/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml b/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml index 31160dcd..eb912fe0 100644 --- a/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-aggregation-spring-boot-starter diff --git a/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java b/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java index 3940a845..19765b9d 100644 --- a/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java +++ b/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java @@ -40,13 +40,13 @@ public class RouteDispatcher { /** * 请求头 */ - public static final String ROUTE_PROXY_HEADER_NAME="knfie4j-gateway-request"; - public static final String ROUTE_PROXY_HEADER_BASIC_NAME="knife4j-gateway-basic-request"; - public static final String OPENAPI_GROUP_ENDPOINT="/swagger-resources"; - public static final String OPENAPI_GROUP_INSTANCE_ENDPOINT="/swagger-instance"; - public static final String ROUTE_BASE_PATH="/"; + public static final String ROUTE_PROXY_HEADER_NAME = "knfie4j-gateway-request"; + public static final String ROUTE_PROXY_HEADER_BASIC_NAME = "knife4j-gateway-basic-request"; + public static final String OPENAPI_GROUP_ENDPOINT = "/swagger-resources"; + public static final String OPENAPI_GROUP_INSTANCE_ENDPOINT = "/swagger-instance"; + public static final String ROUTE_BASE_PATH = "/"; - Logger logger= LoggerFactory.getLogger(RouteDispatcher.class); + Logger logger = LoggerFactory.getLogger(RouteDispatcher.class); /** * 当前项目的contextPath */ @@ -58,73 +58,75 @@ public class RouteDispatcher { private RouteCache routeCache; - private Set ignoreHeaders=new HashSet<>(); + private Set ignoreHeaders = new HashSet<>(); - public RouteDispatcher(RouteRepository routeRepository, RouteCache routeRouteCache, ExecutorEnum executorEnum,String rootPath){ - this.routeRepository=routeRepository; - this.routeCache=routeRouteCache; - this.rootPath=rootPath; + public RouteDispatcher(RouteRepository routeRepository, RouteCache routeRouteCache, + ExecutorEnum executorEnum, String rootPath) { + this.routeRepository = routeRepository; + this.routeCache = routeRouteCache; + this.rootPath = rootPath; initExecutor(executorEnum); ignoreHeaders.addAll(Arrays.asList(new String[]{ - "host","content-length",ROUTE_PROXY_HEADER_NAME,ROUTE_PROXY_HEADER_BASIC_NAME,"Request-Origion" + "host", "content-length", ROUTE_PROXY_HEADER_NAME, ROUTE_PROXY_HEADER_BASIC_NAME, "Request-Origion" })); } - private void initExecutor(ExecutorEnum executorEnum){ - if (executorEnum==null){ + private void initExecutor(ExecutorEnum executorEnum) { + if (executorEnum == null) { throw new IllegalArgumentException("ExecutorEnum can not be empty"); } - switch (executorEnum){ + switch (executorEnum) { case APACHE: - this.routeExecutor=new ApacheClientExecutor(); + this.routeExecutor = new ApacheClientExecutor(); break; case OKHTTP: - this.routeExecutor=new OkHttpClientExecutor(); + this.routeExecutor = new OkHttpClientExecutor(); break; default: - throw new UnsupportedOperationException("UnSupported ExecutorType:"+executorEnum.name()); + throw new UnsupportedOperationException("UnSupported ExecutorType:" + executorEnum.name()); } } - public boolean checkRoute(String header){ - if (StrUtil.isNotBlank(header)){ - SwaggerRoute swaggerRoute=routeCache.get(header); - if (swaggerRoute!=null){ + public boolean checkRoute(String header) { + if (StrUtil.isNotBlank(header)) { + SwaggerRoute swaggerRoute = routeCache.get(header); + if (swaggerRoute != null) { return StrUtil.isNotBlank(swaggerRoute.getUri()); } - swaggerRoute=routeRepository.getRoute(header); - if (swaggerRoute!=null){ - routeCache.put(header,swaggerRoute); + swaggerRoute = routeRepository.getRoute(header); + if (swaggerRoute != null) { + routeCache.put(header, swaggerRoute); return StrUtil.isNotBlank(swaggerRoute.getUri()); } } return false; } - public void execute(HttpServletRequest request, HttpServletResponse response){ - try{ - RouteRequestContext routeContext=new RouteRequestContext(); - this.buildContext(routeContext,request); - RouteResponse routeResponse=routeExecutor.executor(routeContext); - writeResponseHeader(routeResponse,response); - writeBody(routeResponse,response); - }catch (Exception e){ - logger.error("has Error:{}",e.getMessage()); - logger.error(e.getMessage(),e); - //write Default - writeDefault(request,response,e.getMessage()); + public void execute(HttpServletRequest request, HttpServletResponse response) { + try { + RouteRequestContext routeContext = new RouteRequestContext(); + this.buildContext(routeContext, request); + RouteResponse routeResponse = routeExecutor.executor(routeContext); + writeResponseStatus(routeResponse, response); + writeResponseHeader(routeResponse, response); + writeBody(routeResponse, response); + } catch (Exception e) { + logger.error("has Error:{}", e.getMessage()); + logger.error(e.getMessage(), e); + //write Default + writeDefault(request, response, e.getMessage()); } } - protected void writeDefault(HttpServletRequest request,HttpServletResponse response,String errMsg){ + protected void writeDefault(HttpServletRequest request, HttpServletResponse response, String errMsg) { response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); try { - PrintWriter printWriter=response.getWriter(); - Map map= new HashMap<>(); - map.put("message",errMsg); - map.put("code","500"); - map.put("path",request.getRequestURI()); + PrintWriter printWriter = response.getWriter(); + Map map = new HashMap<>(); + map.put("message", errMsg); + map.put("code", "500"); + map.put("path", request.getRequestURI()); new JSONObject(map).write(printWriter); printWriter.close(); } catch (IOException e) { @@ -132,25 +134,38 @@ public class RouteDispatcher { } } + /** + * Write 响应状态码 + * + * @param routeResponse routeResponse + * @param response response + */ + protected void writeResponseStatus(RouteResponse routeResponse, HttpServletResponse response) { + if (routeResponse != null) { + response.setStatus(routeResponse.getStatusCode()); + } + } + /** * Write响应头 + * * @param routeResponse * @param response */ - protected void writeResponseHeader(RouteResponse routeResponse,HttpServletResponse response){ - if (routeResponse!=null){ - if (CollectionUtil.isNotEmpty(routeResponse.getHeaders())){ - for (HeaderWrapper header:routeResponse.getHeaders()){ - if (!StrUtil.equalsIgnoreCase(header.getName(),"Transfer-Encoding")){ - response.addHeader(header.getName(),header.getValue()); + protected void writeResponseHeader(RouteResponse routeResponse, HttpServletResponse response) { + if (routeResponse != null) { + if (CollectionUtil.isNotEmpty(routeResponse.getHeaders())) { + for (HeaderWrapper header : routeResponse.getHeaders()) { + if (!StrUtil.equalsIgnoreCase(header.getName(), "Transfer-Encoding")) { + response.addHeader(header.getName(), header.getValue()); } } } - if (logger.isDebugEnabled()){ - logger.debug("响应类型:{},响应编码:{}",routeResponse.getContentType(),routeResponse.getCharsetEncoding()); + if (logger.isDebugEnabled()) { + logger.debug("响应类型:{},响应编码:{}", routeResponse.getContentType(), routeResponse.getCharsetEncoding()); } response.setContentType(routeResponse.getContentType()); - if (routeResponse.getContentLength()>0){ + if (routeResponse.getContentLength() > 0) { response.setContentLengthLong(routeResponse.getContentLength()); } response.setCharacterEncoding(routeResponse.getCharsetEncoding().displayName()); @@ -159,27 +174,28 @@ public class RouteDispatcher { /** * 响应内容 + * * @param routeResponse * @param response */ - protected void writeBody(RouteResponse routeResponse,HttpServletResponse response) throws IOException { - if (routeResponse!=null){ - if (routeResponse.success()){ - InputStream inputStream=routeResponse.getBody(); - if (inputStream!=null){ - int read=-1; - byte[] bytes=new byte[1024*1024]; - ServletOutputStream outputStream=response.getOutputStream(); - while ((read=inputStream.read(bytes))!=-1){ - outputStream.write(bytes,0,read); + protected void writeBody(RouteResponse routeResponse, HttpServletResponse response) throws IOException { + if (routeResponse != null) { + if (routeResponse.success()) { + InputStream inputStream = routeResponse.getBody(); + if (inputStream != null) { + int read = -1; + byte[] bytes = new byte[1024 * 1024]; + ServletOutputStream outputStream = response.getOutputStream(); + while ((read = inputStream.read(bytes)) != -1) { + outputStream.write(bytes, 0, read); } IoUtil.close(inputStream); IoUtil.close(outputStream); } - }else{ - String text=routeResponse.text(); - if (StrUtil.isNotBlank(text)){ - PrintWriter printWriter=response.getWriter(); + } else { + String text = routeResponse.text(); + if (StrUtil.isNotBlank(text)) { + PrintWriter printWriter = response.getWriter(); printWriter.write(text); printWriter.close(); } @@ -190,80 +206,83 @@ public class RouteDispatcher { /** * 构建路由的请求上下文 + * * @param routeRequestContext * @param request */ - protected void buildContext(RouteRequestContext routeRequestContext,HttpServletRequest request) throws IOException { + protected void buildContext(RouteRequestContext routeRequestContext, HttpServletRequest request) throws IOException { //当前请求是否basic请求 - String basicHeader=request.getHeader(ROUTE_PROXY_HEADER_BASIC_NAME); - if (StrUtil.isNotBlank(basicHeader)){ - BasicAuth basicAuth=routeRepository.getAuth(basicHeader); - if (basicAuth!=null){ + String basicHeader = request.getHeader(ROUTE_PROXY_HEADER_BASIC_NAME); + if (StrUtil.isNotBlank(basicHeader)) { + BasicAuth basicAuth = routeRepository.getAuth(basicHeader); + if (basicAuth != null) { //增加Basic请求头 - routeRequestContext.addHeader("Authorization", RouteUtils.authorize(basicAuth.getUsername(),basicAuth.getPassword())); + routeRequestContext.addHeader("Authorization", RouteUtils.authorize(basicAuth.getUsername(), + basicAuth.getPassword())); } } - SwaggerRoute swaggerRoute=getRoute(request.getHeader(ROUTE_PROXY_HEADER_NAME)); + SwaggerRoute swaggerRoute = getRoute(request.getHeader(ROUTE_PROXY_HEADER_NAME)); //String uri="http://knife4j.xiaominfo.com"; - String uri=swaggerRoute.getUri(); - if (StrUtil.isBlank(uri)){ + String uri = swaggerRoute.getUri(); + if (StrUtil.isBlank(uri)) { throw new RuntimeException("Uri is Empty"); } - String host=URI.create(uri).getHost(); - String fromUri=request.getRequestURI(); - StringBuilder requestUrlBuilder=new StringBuilder(); + String host = URI.create(uri).getHost(); + String fromUri = request.getRequestURI(); + StringBuilder requestUrlBuilder = new StringBuilder(); requestUrlBuilder.append(uri); //判断当前聚合项目的contextPath - if (StrUtil.isNotBlank(this.rootPath)&&!StrUtil.equals(this.rootPath,ROUTE_BASE_PATH)){ - fromUri=fromUri.replaceFirst(this.rootPath,""); + if (StrUtil.isNotBlank(this.rootPath) && !StrUtil.equals(this.rootPath, ROUTE_BASE_PATH)) { + fromUri = fromUri.replaceFirst(this.rootPath, ""); } //判断servicePath - if (StrUtil.isNotBlank(swaggerRoute.getServicePath())&&!StrUtil.equals(swaggerRoute.getServicePath(),ROUTE_BASE_PATH)){ - if (StrUtil.startWith(fromUri,swaggerRoute.getServicePath())){ + if (StrUtil.isNotBlank(swaggerRoute.getServicePath()) && !StrUtil.equals(swaggerRoute.getServicePath(), + ROUTE_BASE_PATH)) { + if (StrUtil.startWith(fromUri, swaggerRoute.getServicePath())) { //实际在请求时,剔除servicePath,否则会造成404 - fromUri=fromUri.replaceFirst(swaggerRoute.getServicePath(),""); + fromUri = fromUri.replaceFirst(swaggerRoute.getServicePath(), ""); } } requestUrlBuilder.append(fromUri); //String requestUrl=uri+fromUri; - String requestUrl=requestUrlBuilder.toString(); - if (logger.isDebugEnabled()){ - logger.debug("目标请求Url:{},请求类型:{},Host:{}",requestUrl,request.getMethod(),host); + String requestUrl = requestUrlBuilder.toString(); + if (logger.isDebugEnabled()) { + logger.debug("目标请求Url:{},请求类型:{},Host:{}", requestUrl, request.getMethod(), host); } routeRequestContext.setOriginalUri(fromUri); routeRequestContext.setUrl(requestUrl); routeRequestContext.setMethod(request.getMethod()); - Enumeration enumeration=request.getHeaderNames(); - while (enumeration.hasMoreElements()){ - String key=enumeration.nextElement(); - String value=request.getHeader(key); - if (!ignoreHeaders.contains(key.toLowerCase())){ - routeRequestContext.addHeader(key,value); + Enumeration enumeration = request.getHeaderNames(); + while (enumeration.hasMoreElements()) { + String key = enumeration.nextElement(); + String value = request.getHeader(key); + if (!ignoreHeaders.contains(key.toLowerCase())) { + routeRequestContext.addHeader(key, value); } } - routeRequestContext.addHeader("Host",host); - Enumeration params=request.getParameterNames(); - while (params.hasMoreElements()){ - String name=params.nextElement(); - String value=request.getParameter(name); + routeRequestContext.addHeader("Host", host); + Enumeration params = request.getParameterNames(); + while (params.hasMoreElements()) { + String name = params.nextElement(); + String value = request.getParameter(name); //logger.info("param-name:{},value:{}",name,value); - routeRequestContext.addParam(name,value); + routeRequestContext.addParam(name, value); } routeRequestContext.setRequestContent(request.getInputStream()); } - public SwaggerRoute getRoute(String header){ - SwaggerRoute swaggerRoute=routeCache.get(header); - if (swaggerRoute==null){ - swaggerRoute=routeRepository.getRoute(header); - if (swaggerRoute!=null){ - routeCache.put(header,swaggerRoute); + public SwaggerRoute getRoute(String header) { + SwaggerRoute swaggerRoute = routeCache.get(header); + if (swaggerRoute == null) { + swaggerRoute = routeRepository.getRoute(header); + if (swaggerRoute != null) { + routeCache.put(header, swaggerRoute); } } return swaggerRoute; } - public List getRoutes(){ + public List getRoutes() { return routeRepository.getRoutes(); } } diff --git a/knife4j/knife4j-annotations/pom.xml b/knife4j/knife4j-annotations/pom.xml index 3d094b4a..fa47920e 100644 --- a/knife4j/knife4j-annotations/pom.xml +++ b/knife4j/knife4j-annotations/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-annotations diff --git a/knife4j/knife4j-core/pom.xml b/knife4j/knife4j-core/pom.xml index a4ac84b1..b5b40e3b 100644 --- a/knife4j/knife4j-core/pom.xml +++ b/knife4j/knife4j-core/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-dependencies/pom.xml b/knife4j/knife4j-dependencies/pom.xml index d695d22d..43f6be6d 100644 --- a/knife4j/knife4j-dependencies/pom.xml +++ b/knife4j/knife4j-dependencies/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.xiaoymin knife4j-dependencies - 2.0.8 + 2.0.9 pom knife4j-dependencies Knife4j Dependencies @@ -35,7 +35,7 @@ 1.8 - 2.0.8 + 2.0.9 1.5.22 2.10.5 2.0.0.RELEASE diff --git a/knife4j/knife4j-jfinal-ui/pom.xml b/knife4j/knife4j-jfinal-ui/pom.xml index 7de1b446..0b3f99ec 100644 --- a/knife4j/knife4j-jfinal-ui/pom.xml +++ b/knife4j/knife4j-jfinal-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-jfinal/pom.xml b/knife4j/knife4j-jfinal/pom.xml index cf7fa601..1ba7d557 100644 --- a/knife4j/knife4j-jfinal/pom.xml +++ b/knife4j/knife4j-jfinal/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-micro-spring-boot-starter/pom.xml b/knife4j/knife4j-micro-spring-boot-starter/pom.xml index ad9bc43a..d395175b 100644 --- a/knife4j/knife4j-micro-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-micro-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-boot-autoconfigure/pom.xml b/knife4j/knife4j-spring-boot-autoconfigure/pom.xml index 75a28de0..7849b68f 100644 --- a/knife4j/knife4j-spring-boot-autoconfigure/pom.xml +++ b/knife4j/knife4j-spring-boot-autoconfigure/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-boot-starter/pom.xml b/knife4j/knife4j-spring-boot-starter/pom.xml index f8d56160..fe337567 100644 --- a/knife4j/knife4j-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring-boot-starter diff --git a/knife4j/knife4j-spring-mvc/pom.xml b/knife4j/knife4j-spring-mvc/pom.xml index bf0a3121..ccb95af1 100644 --- a/knife4j/knife4j-spring-mvc/pom.xml +++ b/knife4j/knife4j-spring-mvc/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-ui/pom.xml b/knife4j/knife4j-spring-ui/pom.xml index 5d073d42..db9926b3 100644 --- a/knife4j/knife4j-spring-ui/pom.xml +++ b/knife4j/knife4j-spring-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring-ui diff --git a/knife4j/knife4j-spring/pom.xml b/knife4j/knife4j-spring/pom.xml index f98bdbc5..fd7e1366 100644 --- a/knife4j/knife4j-spring/pom.xml +++ b/knife4j/knife4j-spring/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring diff --git a/knife4j/knife4j-springdoc-ui/pom.xml b/knife4j/knife4j-springdoc-ui/pom.xml index bcf9a628..d931c3c6 100644 --- a/knife4j/knife4j-springdoc-ui/pom.xml +++ b/knife4j/knife4j-springdoc-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/pom.xml b/knife4j/pom.xml index 82a112b4..966e5d04 100644 --- a/knife4j/pom.xml +++ b/knife4j/pom.xml @@ -6,7 +6,7 @@ com.github.xiaoymin knife4j - 2.0.8 + 2.0.9 knife4j-annotations knife4j-spring @@ -39,7 +39,7 @@ UTF-8 - 2.0.8 + 2.0.9 1.8 5.2.2.RELEASE 2.10.5 -- Gitee