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 53e1665fe410bfed49b10a6efdb41bfff7628ef8..c1002ebec4c89d68482d72f862875f758f6dd0f9 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 0000000000000000000000000000000000000000..64c3b86680992c67eb0d3a146d559b50eae1ad63 --- /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 4798fa8b50e15e1d23edc66bb654024d9ad5a5da..5fd967c16c10dfd19ca63659a037c09ee019a8a7 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 1a0fbc74aacbd6de262fe744b14737c3edbf7d79..d280a95ca36e54bc273c7ab76ad135b18c4ca0df 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 58376288c119d0662a83e04ea2fc5887aeb5c81d..bda6c67c955369d9b6c0a72a5e0d29a60739805d 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 c3322b386c6749d11f34dcf43aeef88b87f7a26e..1a789241fbcdb07491d6bceb82df6dfa84e13433 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 02fb23c0b971ef7b30b2a24fbde2e5f2f4cd6454..4e4306f170d4be44106eba679b5c867ef9e274f5 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 dfb399be073104846a17c482f05ccaf835ca5159..1e66c507bb5005104e465bcec25bf7589fba8b9b 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 0000000000000000000000000000000000000000..1c944eb29b8ca6c23210010cb64507e6742c94dd --- /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); + } + + + + + +}