From d3792ad2862518661c6a053f6bd932b320ad4e1f Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Mon, 28 Dec 2020 00:40:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E6=97=A0token=E6=97=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BA=E4=BC=9A=E8=AF=9D=EF=BC=8C=E5=AE=8C?= =?UTF-8?q?=E7=BE=8E=E5=85=BC=E5=AE=B9`token-session`=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/stp/StpLogic.java | 44 ++++++++++++++++--- .../java/cn/dev33/satoken/stp/StpUtil.java | 3 +- .../dev33/satoken/util/SaTokenInsideUtil.java | 7 +++ .../src/main/resources/application.yml | 1 + 4 files changed, 47 insertions(+), 8 deletions(-) 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配置