From d1d25f4d49126144ffa75d794dd131cd6ea15a84 Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Wed, 13 Jan 2021 02:00:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ESaRouterUtil=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BC=98=E9=9B=85=E7=9A=84=E8=B7=AF=E7=94=B1=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=BC=8F=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/SaTokenManager.java | 3 - .../cn/dev33/satoken/fun/IsRunFunction.java | 33 ++++ .../satoken/{stp => fun}/SaFunction.java | 2 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 1 + .../java/cn/dev33/satoken/stp/StpUtil.java | 1 + .../java/com/pj/satoken/MySaTokenConfig.java | 2 +- .../autowired/SaTokenSpringAutowired.java | 17 ++ .../interceptor/SaRouteInterceptor.java | 4 +- .../satoken/interceptor/SaRouterUtil.java | 163 ++++++++++++++++++ 9 files changed, 219 insertions(+), 7 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java rename sa-token-core/src/main/java/cn/dev33/satoken/{stp => fun}/SaFunction.java (83%) create mode 100644 sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java index 53e1665f..c1002ebe 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java @@ -146,7 +146,4 @@ public class SaTokenManager { - - - } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java new file mode 100644 index 00000000..64c3b866 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java @@ -0,0 +1,33 @@ +package cn.dev33.satoken.fun; + +/** + * 根据boolean变量,决定是否执行一个函数 + * @author kong + * + */ +public class IsRunFunction { + + /** + * 变量 + */ + public Boolean isRun; + + /** + * 设定一个变量,如果为true,则执行exe函数 + * @param isRun 变量 + */ + public IsRunFunction(boolean isRun) { + this.isRun = isRun; + } + + /** + * 根据变量决定是否执行此函数 + * @param function 函数 + */ + public void exe(SaFunction function) { + if(isRun) { + function.run(); + } + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java similarity index 83% rename from sa-token-core/src/main/java/cn/dev33/satoken/stp/SaFunction.java rename to sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java index 4798fa8b..5fd967c1 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaFunction.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java @@ -1,4 +1,4 @@ -package cn.dev33.satoken.stp; +package cn.dev33.satoken.fun; /** * 模拟身份方法的辅助类 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index 1a0fbc74..d280a95c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -19,6 +19,7 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.NotRoleException; +import cn.dev33.satoken.fun.SaFunction; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.TokenSign; import cn.dev33.satoken.util.SaTokenConsts; diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index 58376288..bda6c67c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -2,6 +2,7 @@ package cn.dev33.satoken.stp; import java.util.List; +import cn.dev33.satoken.fun.SaFunction; import cn.dev33.satoken.session.SaSession; /** diff --git a/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java b/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java index c3322b38..1a789241 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java @@ -31,7 +31,7 @@ public class MySaTokenConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册注解拦截器 - registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); // 全局拦截器 + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); } diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java index 02fb23c0..4e4306f1 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +import org.springframework.util.PathMatcher; import cn.dev33.satoken.SaTokenManager; import cn.dev33.satoken.action.SaTokenAction; @@ -97,4 +98,20 @@ public class SaTokenSpringAutowired { } + + /** + * 路由匹配器 + */ + public static PathMatcher pathMatcher; + /** + * 利用自动匹配特性,获取SpringMVC框架内部使用的路由匹配器 + * @param pathMatcher 要设置的 pathMatcher + */ + @Autowired(required = false) + public static void setPathMatcher(PathMatcher pathMatcher) { + SaTokenSpringAutowired.pathMatcher = pathMatcher; + } + + + } diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java index dfb399be..1e66c507 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java @@ -43,7 +43,8 @@ public class SaRouteInterceptor implements HandlerInterceptor { */ private SaRouteFunction function; - + + /** * 表示登录验证 */ @@ -144,7 +145,6 @@ public class SaRouteInterceptor implements HandlerInterceptor { return this; } - // ----------------- 构建相关 ----------------- /** diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java new file mode 100644 index 00000000..1c944eb2 --- /dev/null +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java @@ -0,0 +1,163 @@ +package cn.dev33.satoken.interceptor; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +import cn.dev33.satoken.SaTokenManager; +import cn.dev33.satoken.autowired.SaTokenSpringAutowired; +import cn.dev33.satoken.fun.IsRunFunction; +import cn.dev33.satoken.fun.SaFunction; + +/** + * 对路由匹配符相关操作的封装工具类 + * @author kong + * + */ +public class SaRouterUtil { + + /** + * 在进行路由匹配时所使用的的 PathMatcher 对象 + */ + private static PathMatcher pathMatcher; + + /** + * @return 在进行路由匹配时所使用的的 PathMatcher 对象 + */ + public static PathMatcher getPathMatcher() { + if(pathMatcher == null) { + pathMatcher = SaTokenSpringAutowired.pathMatcher; + if(pathMatcher == null) { + pathMatcher = new AntPathMatcher(); + } + } + return pathMatcher; + } + + /** + * @param pathMatcher 写入: 在进行路由匹配时所使用的的 PathMatcher 对象 + */ + public static void setPathMatcher(PathMatcher pathMatcher) { + SaRouterUtil.pathMatcher = pathMatcher; + } + + + // -------------------- 路由匹配相关 -------------------- + + /** + * 校验指定路由匹配符是否可以匹配成功指定路径 + * @param pattern 路由匹配符 + * @param path 需要匹配的路径 + * @return 是否匹配成功 + */ + public static boolean isMatch(String pattern, String path) { + if(getPathMatcher().match(pattern, path)) { + return true; + } + return false; + } + + /** + * 校验指定路由匹配符是否可以匹配成功指定路径 + * @param pattern 路由匹配符 + * @param path 需要匹配的路径集合 + * @return 是否匹配成功 + */ + public static boolean isMatch(List patterns, String path) { + for (String pattern : patterns) { + if(isMatch(pattern, path)) { + return true; + } + } + return false; + } + + /** + * 校验指定路由匹配符是否可以匹配成功当前URI + * @param pattern 路由匹配符 + * @return 是否匹配成功 + */ + public static boolean isMatchCurrURI(String pattern) { + return isMatch(pattern, SaTokenManager.getSaTokenServlet().getRequest().getRequestURI()); + } + + /** + * 校验指定路由匹配符是否可以匹配成功当前URI + * @param pattern 路由匹配符 + * @return 是否匹配成功 + */ + public static boolean isMatchCurrURI(List patterns) { + return isMatch(patterns, SaTokenManager.getSaTokenServlet().getRequest().getRequestURI()); + } + + + // -------------------- 执行相关 -------------------- + + /** + * 使用路由匹配符与当前URI执行匹配,如果匹配成功则执行验证函数 + * @param pattern 路由匹配符 + * @param function 要执行的方法 + */ + public static void match(String pattern, SaFunction function) { + if(isMatchCurrURI(pattern)) { + function.run(); + } + } + + /** + * 使用路由匹配符与当前URI执行匹配 (并指定排除匹配符),如果匹配成功则执行验证函数 + * @param pattern 路由匹配符 + * @param excludePattern 要排除的路由匹配符 + * @param function 要执行的方法 + */ + public static void match(String pattern, String excludePattern, SaFunction function) { + if(isMatchCurrURI(pattern)) { + if(isMatchCurrURI(excludePattern) == false) { + function.run(); + } + } + } + + /** + * 使用路由匹配符集合与当前URI执行匹配,如果匹配成功则执行验证函数 + * @param patterns 路由匹配符集合 + * @param function 要执行的方法 + */ + public static void match(List patterns, SaFunction function) { + if(isMatchCurrURI(patterns)) { + function.run(); + } + } + + /** + * 使用路由匹配符集合与当前URI执行匹配 (并指定排除匹配符),如果匹配成功则执行验证函数 + * @param patterns 路由匹配符集合 + * @param excludePatterns 要排除的路由匹配符集合 + * @param function 要执行的方法 + */ + public static void match(List patterns, List excludePatterns, SaFunction function) { + if(isMatchCurrURI(patterns)) { + if(isMatchCurrURI(excludePatterns) == false) { + function.run(); + } + } + } + + + /** + * 使用路由匹配符集合与当前URI执行匹配,如果匹配成功则执行验证函数 + * @param patterns 路由匹配符集合 + * @return 匹配结果包装对象 + */ + public static IsRunFunction match(String... patterns) { + boolean matchResult = isMatch(Arrays.asList(patterns), SaTokenManager.getSaTokenServlet().getRequest().getRequestURI()); + return new IsRunFunction(matchResult); + } + + + + + +}