diff --git a/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java b/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java index bcbf1b2..c644bf6 100644 --- a/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java +++ b/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java @@ -2,26 +2,19 @@ package ink.wgink.gateway.component; import ink.wgink.gateway.consts.ISystemConst; import ink.wgink.gateway.dao.route.IRouteDao; -import ink.wgink.gateway.handler.route.RouteHandler; +import ink.wgink.gateway.filter.local.CommonFilters; import ink.wgink.gateway.pojo.route.Route; import ink.wgink.gateway.util.UUIDUtil; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.loadbalancer.*; import org.springframework.cloud.gateway.filter.FilterDefinition; -import org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory; import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionRepository; -import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.stereotype.Component; -import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.io.IOException; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -91,7 +84,7 @@ public class MongoRouteDefinitionRepository implements RouteDefinitionRepository // 路由断言 PredicateDefinition pathPredicateDefinition = new PredicateDefinition(); Map pathPredicateDefinitionMap = new HashMap<>(2); - pathPredicateDefinitionMap.put(RoutePredicateFactory.PATTERN_KEY, ISystemConst.ROUTE_PREFIX + route.getPath()); + pathPredicateDefinitionMap.put(RoutePredicateFactory.PATTERN_KEY, route.getPath()); pathPredicateDefinition.setName("Path"); pathPredicateDefinition.setArgs(pathPredicateDefinitionMap); // 添加路由断言 @@ -105,16 +98,13 @@ public class MongoRouteDefinitionRepository implements RouteDefinitionRepository * @return */ private List listFilterDefinition(Route route) { + CommonFilters commonFilters = new CommonFilters(); // 定义过滤器 List filterDefinitions = new ArrayList<>(); - FilterDefinition rewritePathFilterDefinition = new FilterDefinition(); - Map rewritePathFilterDefinitionMap = new HashMap<>(2); - rewritePathFilterDefinitionMap.put(RewritePathGatewayFilterFactory.REGEXP_KEY, ISystemConst.ROUTE_PREFIX + "/?(?.*)"); - rewritePathFilterDefinitionMap.put(RewritePathGatewayFilterFactory.REPLACEMENT_KEY, "/$\\{segment}"); - rewritePathFilterDefinition.setArgs(rewritePathFilterDefinitionMap); - rewritePathFilterDefinition.setName("RewritePath"); // 添加重写过滤 - filterDefinitions.add(rewritePathFilterDefinition); + filterDefinitions.add(commonFilters.rewriteFilterDefinition(route)); + // 去除前缀 +// filterDefinitions.add(commonFilters.setPathFilterDefinition(route)); return filterDefinitions; } diff --git a/src/main/java/ink/wgink/gateway/filter/global/CountGlobalFilter.java b/src/main/java/ink/wgink/gateway/filter/global/CountGlobalFilter.java index 9993f97..4275be2 100644 --- a/src/main/java/ink/wgink/gateway/filter/global/CountGlobalFilter.java +++ b/src/main/java/ink/wgink/gateway/filter/global/CountGlobalFilter.java @@ -36,7 +36,6 @@ public class CountGlobalFilter implements GlobalFilter, Ordered { System.out.println(); return chain.filter(exchange); -// return exchange.getResponse().setComplete(); } @Override diff --git a/src/main/java/ink/wgink/gateway/filter/local/CommonFilters.java b/src/main/java/ink/wgink/gateway/filter/local/CommonFilters.java new file mode 100644 index 0000000..f4c9e2d --- /dev/null +++ b/src/main/java/ink/wgink/gateway/filter/local/CommonFilters.java @@ -0,0 +1,55 @@ +package ink.wgink.gateway.filter.local; + +import ink.wgink.gateway.consts.ISystemConst; +import ink.wgink.gateway.pojo.route.Route; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory; +import org.springframework.cloud.gateway.filter.factory.SetPathGatewayFilterFactory; + +import java.util.HashMap; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: CommonFilters + * @Description: 通用过滤器 + * @Author: WangGeng + * @Date: 2021/4/24 20:31 + * @Version: 1.0 + **/ +public class CommonFilters { + + /** + * 重写过滤器 + * + * @param route + * @return + */ + public FilterDefinition rewriteFilterDefinition(Route route) { + FilterDefinition rewritePathFilterDefinition = new FilterDefinition(); + Map rewritePathFilterDefinitionMap = new HashMap<>(4); + rewritePathFilterDefinitionMap.put(RewritePathGatewayFilterFactory.REGEXP_KEY, ISystemConst.ROUTE_PREFIX + "/?(?.*)"); + rewritePathFilterDefinitionMap.put(RewritePathGatewayFilterFactory.REPLACEMENT_KEY, "/$\\{segment}"); + rewritePathFilterDefinition.setArgs(rewritePathFilterDefinitionMap); + rewritePathFilterDefinition.setName("RewritePath"); + return rewritePathFilterDefinition; + } + + /** + * 设置路径过滤器,去除前缀 + * + * @param route + * @return + */ + public FilterDefinition setPathFilterDefinition(Route route) { + FilterDefinition setPathFilterDefinition = new FilterDefinition(); + Map setPathFilterDefinitionMap = new HashMap<>(2); + setPathFilterDefinitionMap.put(SetPathGatewayFilterFactory.TEMPLATE_KEY, route.getPath().replaceFirst(ISystemConst.ROUTE_PREFIX, "/")); + setPathFilterDefinition.setArgs(setPathFilterDefinitionMap); + setPathFilterDefinition.setName("SetPath"); + return setPathFilterDefinition; + } + +} diff --git a/src/main/java/ink/wgink/gateway/filter/web/WebFluxFilter.java b/src/main/java/ink/wgink/gateway/filter/web/WebFluxFilter.java index fb60c42..67a57c9 100644 --- a/src/main/java/ink/wgink/gateway/filter/web/WebFluxFilter.java +++ b/src/main/java/ink/wgink/gateway/filter/web/WebFluxFilter.java @@ -3,6 +3,8 @@ package ink.wgink.gateway.filter.web; import ink.wgink.gateway.consts.ISystemConst; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; @@ -29,8 +31,17 @@ import java.util.List; @Component public class WebFluxFilter implements WebFilter { + /** + * 校验的路径 + */ + private List unPassPatterns = Arrays.asList(new PathPattern[]{ + new PathPatternParser().parse(ISystemConst.ADMIN_ROUTER_PREFIX + "/**") + }); + + /** + * 不校验的路径 + */ private List passPathPatterns = Arrays.asList(new PathPattern[]{ - new PathPatternParser().parse(ISystemConst.ROUTE_PREFIX + "/**"), new PathPatternParser().parse(ISystemConst.ADMIN_ROUTER_PREFIX + "/assets/**"), new PathPatternParser().parse(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/sign/**"), new PathPatternParser().parse(ISystemConst.PAGE_LOGIN), @@ -38,18 +49,25 @@ public class WebFluxFilter implements WebFilter { @Override public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { - if (this.isPass(serverWebExchange)) { - return webFilterChain.filter(serverWebExchange); - } - return serverWebExchange.getSession().flatMap(webSession -> { - if (this.isLogin(webSession)) { + ServerHttpResponse serverHttpResponse = serverWebExchange.getResponse(); + HttpHeaders headers = serverHttpResponse.getHeaders(); + // 校验登录的路径,管理使用 + if(this.isUnPass(serverWebExchange)) { + // 直接放行的路径 + if (this.isPass(serverWebExchange)) { return webFilterChain.filter(serverWebExchange); } - serverWebExchange.getResponse().setStatusCode(HttpStatus.FOUND); - HttpHeaders headers = serverWebExchange.getResponse().getHeaders(); - headers.setLocation(URI.create(ISystemConst.PAGE_LOGIN)); - return serverWebExchange.getResponse().setComplete(); - }); + return serverWebExchange.getSession().flatMap(webSession -> { + if (this.isLogin(webSession)) { + return webFilterChain.filter(serverWebExchange); + } + serverHttpResponse.setStatusCode(HttpStatus.FOUND); + headers.setLocation(URI.create(ISystemConst.PAGE_LOGIN)); + return serverHttpResponse.setComplete(); + }); + } + // 其它情况,一律放行 + return webFilterChain.filter(serverWebExchange); } /** @@ -62,6 +80,16 @@ public class WebFluxFilter implements WebFilter { return passPathPatterns.stream().anyMatch(pathPattern -> pathPattern.matches(serverWebExchange.getRequest().getPath())); } + /** + * 是否校验登录 + * + * @param serverWebExchange + * @return + */ + private boolean isUnPass(ServerWebExchange serverWebExchange) { + return unPassPatterns.stream().anyMatch(pathPattern -> pathPattern.matches(serverWebExchange.getRequest().getPath())); + } + /** * 是否登录 * diff --git a/src/main/resources/static/wg/assets/layui-v2.6.4/layui/modules/regex.js b/src/main/resources/static/wg/assets/layui-v2.6.4/layui/modules/regex.js index df3e360..bcb876b 100644 --- a/src/main/resources/static/wg/assets/layui-v2.6.4/layui/modules/regex.js +++ b/src/main/resources/static/wg/assets/layui-v2.6.4/layui/modules/regex.js @@ -1,7 +1,7 @@ layui.define(function(exports) { var pathRegex = function(value) { - if(/^\/[^\s]+/.test(value)) { + if(/^\/[^\s]*/.test(value)) { return true; } return false; diff --git a/src/main/resources/static/wg/route/route/save.html b/src/main/resources/static/wg/route/route/save.html index c1c5934..39620ba 100644 --- a/src/main/resources/static/wg/route/route/save.html +++ b/src/main/resources/static/wg/route/route/save.html @@ -36,7 +36,7 @@
-
直接访问网关的路径,支持通配符,路径中的变量用{}包含,如/p1/**,/p2/{pq1}/{pq2}
+
直接访问网关的路径,路径中的变量用{}包含,/p2/{pq1}/{pq2}
diff --git a/src/main/resources/static/wg/route/route/update.html b/src/main/resources/static/wg/route/route/update.html index 96c840e..1abc9b7 100644 --- a/src/main/resources/static/wg/route/route/update.html +++ b/src/main/resources/static/wg/route/route/update.html @@ -36,7 +36,7 @@
-
直接访问网关的路径,支持通配符,路径中的变量用{}包含,如/p1/**,/p2/{pq1}/{pq2}
+
直接访问网关的路径,路径中的变量用{}包含,/p2/{pq1}/{pq2}
@@ -48,8 +48,8 @@
-