diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java index 1aa86328..44c0f033 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java @@ -4,7 +4,6 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.util.List; import java.util.UUID; -import java.util.regex.Pattern; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.annotation.SaCheckLogin; @@ -73,11 +72,21 @@ public class SaTokenActionDefaultImpl implements SaTokenAction { if(list == null || list.size() == 0) { return false; } + + // 先尝试一下简单匹配,如果可以匹配成功则无需继续模糊匹配 if (list.contains(element)) { return true; - }else{ - return list.stream().anyMatch(patt-> Pattern.matches(patt.replaceAll("\\*", ".*"), element)); } + + // 开始模糊匹配 + for (String patt : list) { + if(SaFoxUtil.vagueMatch(patt, element)) { + return true; + } + } + + // 走出for循环说明没有一个元素可以匹配成功 + return false; } /** @@ -86,21 +95,26 @@ public class SaTokenActionDefaultImpl implements SaTokenAction { @Override public void checkMethodAnnotation(Method method) { - // 获取这个 Method 所属的 Class - Class clazz = method.getDeclaringClass(); - - validateAnnotation(clazz); + // 先校验 Method 所属 Class 上的注解 + validateAnnotation(method.getDeclaringClass()); + + // 再校验 Method 上的注解 validateAnnotation(method); } - private void validateAnnotation(AnnotatedElement target) { - // 校验 @SaCheckLogin 注解 + /** + * 从指定元素校验注解 + * @param target see note + */ + protected void validateAnnotation(AnnotatedElement target) { + + // 校验 @SaCheckLogin 注解 if(target.isAnnotationPresent(SaCheckLogin.class)) { SaCheckLogin at = target.getAnnotation(SaCheckLogin.class); SaManager.getStpLogic(at.key()).checkByAnnotation(at); } - // 校验 @SaCheckRole 注解 + // 校验 @SaCheckRole 注解 if(target.isAnnotationPresent(SaCheckRole.class)) { SaCheckRole at = target.getAnnotation(SaCheckRole.class); SaManager.getStpLogic(at.key()).checkByAnnotation(at); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 741c62b0..af29cd17 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -115,7 +115,7 @@ public class SaTokenConfig { /** * @return 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) */ - public Boolean isAllowConcurrentLogin() { + public Boolean getAllowConcurrentLogin() { return allowConcurrentLogin; } @@ -131,7 +131,7 @@ public class SaTokenConfig { /** * @return 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) */ - public Boolean isShareToken() { + public Boolean getIsShare() { return isShare; } @@ -179,7 +179,7 @@ public class SaTokenConfig { /** * @return 是否尝试从cookie里读取token */ - public Boolean isReadCookie() { + public Boolean getIsReadCookie() { return isReadCookie; } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java index 23ebdd81..08180769 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java @@ -111,7 +111,9 @@ public class SaTokenConfigFactory { @SuppressWarnings("unchecked") private static T getObjectByClass(String str, Class cs) { Object value; - if (cs.equals(String.class)) { + if (str == null) { + value = null; + } else if (cs.equals(String.class)) { value = str; } else if (cs.equals(int.class) || cs.equals(Integer.class)) { value = Integer.valueOf(str); 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 909e3c08..85b2c21f 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 @@ -1,7 +1,6 @@ package cn.dev33.satoken.stp; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -107,7 +106,7 @@ public class StpLogic { } // 注入Cookie - if(config.isReadCookie()){ + if(config.getIsReadCookie()){ SaResponse response = SaHolder.getResponse(); response.addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), cookieTimeout); } @@ -138,7 +137,7 @@ public class StpLogic { tokenValue = request.getHeader(keyTokenName); } // 4. 尝试从cookie里读取 - if(tokenValue == null && config.isReadCookie()){ + if(tokenValue == null && config.getIsReadCookie()){ tokenValue = request.getCookieValue(keyTokenName); } @@ -227,9 +226,9 @@ public class StpLogic { // ------ 2、生成一个token String tokenValue = null; // --- 如果允许并发登录 - if(config.isAllowConcurrentLogin()) { + if(config.getAllowConcurrentLogin()) { // 如果配置为共享token, 则尝试从Session签名记录里取出token - if(config.isShareToken()) { + if(config.getIsShare()) { tokenValue = getTokenValueByLoginId(loginId, loginModel.getDevice()); } } else { @@ -291,7 +290,7 @@ public class StpLogic { return; } // 如果打开了cookie模式,第一步,先把cookie清除掉 - if(getConfig().isReadCookie()){ + if(getConfig().getIsReadCookie()){ SaHolder.getResponse().deleteCookie(getTokenName()); } logoutByTokenValue(tokenValue); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java index 6cbb1e0e..e34d2835 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java @@ -129,5 +129,22 @@ public class SaFoxUtil { } return list2; } + + /** + * 字符串模糊匹配 + *

example: + *

user* user-add -- true + *

user* art-add -- false + * @param patt 表达式 + * @param str 待匹配的字符串 + * @return 是否可以匹配 + */ + public static boolean vagueMatch(String patt, String str) { + // 如果表达式不带有*号,则只需简单equals即可 (速度提升200倍) + if(patt.indexOf("*") == -1) { + return patt.equals(str); + } + return Pattern.matches(patt.replaceAll("\\*", ".*"), str); + } } diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index 142e5f20..7699f9f9 100644 --- a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -241,20 +241,6 @@ public class TestController { @RequestMapping("test") public AjaxJson test() { System.out.println("进来了"); -// System.out.println(StpUtil.getTokenInfo()); - StpUtil.setLoginId(10001); - String ss = StpUtil.getSession().get("name", () -> { - System.out.println("-=------进入方法"); - return "zhangsan"; - }); - ss = StpUtil.getSession().get("name", () -> { - System.out.println("-=------进入方法2"); - return "zhangsan2"; - }); - - StpUtil.getSession().delete("name"); - System.out.println(ss); - return AjaxJson.getSuccess("访问成功"); }