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 77039dfb..3f6b3e1f 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,6 +1,7 @@ package cn.dev33.satoken.stp; import java.util.List; +import java.util.Objects; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -428,7 +429,18 @@ public class StpLogic { return getSession(true); } - // ---------- token专属session + + // =================== token专属session =================== + + /** + * 获取指定token的专属session,如果session尚未创建,isCreate代表是否新建并返回 + * @param tokenValue token值 + * @param isCreate 是否新建 + * @return session会话 + */ + public SaSession getTokenSessionByToken(String tokenValue, boolean isCreate) { + return getSessionBySessionId(getKeyTokenSession(tokenValue), isCreate); + } /** * 获取指定token的专属session,如果session尚未创建,则新建并返回 @@ -438,6 +450,27 @@ public class StpLogic { public SaSession getTokenSessionByToken(String tokenValue) { return getSessionBySessionId(getKeyTokenSession(tokenValue), true); } + + /** + * 获取当前token的专属-session,如果session尚未创建,isCreate代表是否新建并返回 + *
只有当前会话属于登录状态才可调用 + * @param isCreate 是否新建 + * @return session会话 + */ + public SaSession getTokenSession(boolean isCreate) { + // 如果配置了需要校验登录状态,则验证一下 + if(getConfig().getTokenSessionCheckLogin()) { + checkLogin(); + } else { + // 如果配置忽略token登录校验,则必须保证token不为null (token为null的时候随机创建一个) + String tokenValue = getTokenValue(); + if(tokenValue == null || Objects.equals(tokenValue, "")) { + setLoginId(SaTokenInsideUtil.getMarking28()); + } + } + // 返回这个token对应的专属session + return getSessionBySessionId(getKeyTokenSession(getTokenValue()), isCreate); + } /** * 获取当前token的专属-session,如果session尚未创建,则新建并返回 @@ -445,10 +478,7 @@ public class StpLogic { * @return session会话 */ public SaSession getTokenSession() { - if(getConfig().getTokenSessionCheckLogin()) { - checkLogin(); - } - return getTokenSessionByToken(getTokenValue()); + return getTokenSession(true); } @@ -755,10 +785,10 @@ public class StpLogic { } /** - * 返回配置对象 + * 返回配置对象 */ public SaTokenConfig getConfig() { - // 为什么再代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利 + // 为什么再次代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利 return SaTokenManager.getConfig(); } 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 38b97aec..802a2e04 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 @@ -207,7 +207,8 @@ public class StpUtil { return stpLogic.getSession(); } - // ---------- token专属session + + // =================== token专属session =================== /** * 获取指定token的专属session,如果session尚未创建,则新建并返回 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java index bc5a11a9..b85c16f1 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java @@ -59,5 +59,12 @@ public class SaTokenInsideUtil { return sb.toString(); } + /** + * 以当前时间戳和随机int数字拼接一个随机字符串 + */ + public static String getMarking28() { + return System.currentTimeMillis() + "" + new Random().nextInt(Integer.MAX_VALUE); + } + } diff --git a/sa-token-demo-springboot/src/main/resources/application.yml b/sa-token-demo-springboot/src/main/resources/application.yml index c88224f6..97f4bb9b 100644 --- a/sa-token-demo-springboot/src/main/resources/application.yml +++ b/sa-token-demo-springboot/src/main/resources/application.yml @@ -23,6 +23,7 @@ spring: token-style: uuid # 是否在初始化配置时打印版本字符画 is-v: true + tokenSessionCheckLogin: false # redis配置