diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java index b216f2b0..17893b86 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java @@ -28,6 +28,13 @@ public class SaTokenInfo { /** session剩余有效时间 (单位: 秒) */ public long sessionTimeout; + /** token专属session剩余有效时间 (单位: 秒) */ + public long tokenSessionTimeout; + + + + + /** * token剩余无操作有效时间 */ @@ -146,6 +153,21 @@ public class SaTokenInfo { return this; } + /** + * @return tokenSessionTimeout + */ + public long getTokenSessionTimeout() { + return tokenSessionTimeout; + } + + /** + * @param tokenSessionTimeout 要设置的 tokenSessionTimeout + */ + public SaTokenInfo setTokenSessionTimeout(long tokenSessionTimeout) { + this.tokenSessionTimeout = tokenSessionTimeout; + return this; + } + /** * @return tokenActivityTimeout */ @@ -169,8 +191,11 @@ public class SaTokenInfo { public String toString() { return "SaTokenInfo [tokenName=" + tokenName + ", tokenValue=" + tokenValue + ", isLogin=" + isLogin + ", loginId=" + loginId + ", loginKey=" + loginKey + ", tokenTimeout=" + tokenTimeout - + ", sessionTimeout=" + sessionTimeout + ", tokenActivityTimeout=" + tokenActivityTimeout + "]"; + + ", sessionTimeout=" + sessionTimeout + ", tokenSessionTimeout=" + tokenSessionTimeout + + ", tokenActivityTimeout=" + tokenActivityTimeout + "]"; } + + 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 5d9c68f8..0f5b633c 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 @@ -119,6 +119,7 @@ public class StpLogic { info.loginKey = getLoginKey(); info.tokenTimeout = getTokenTimeout(); info.sessionTimeout = getSessionTimeout(); + info.tokenSessionTimeout = getTokenSessionTimeout(); info.tokenActivityTimeout = getTokenActivityTimeout(); return info; } @@ -382,7 +383,7 @@ public class StpLogic { * @param isCreate 是否新建 * @return session对象 */ - protected SaSession getSessionBySessionId(String sessionId, boolean isCreate) { + public SaSession getSessionBySessionId(String sessionId, boolean isCreate) { SaSession session = SaTokenManager.getSaTokenDao().getSession(sessionId); if(session == null && isCreate) { session = new SaSession(sessionId); @@ -427,6 +428,27 @@ public class StpLogic { return getSession(true); } + // ---------- token专属session + + /** + * 获取指定token的专属session,如果session尚未创建,则新建并返回 + * @param tokenValue token值 + * @return session会话 + */ + public SaSession getTokenSessionByToken(String tokenValue) { + return getSessionBySessionId(getKeyTokenSession(tokenValue), true); + } + + /** + * 获取当前token的专属-session,如果session尚未创建,则新建并返回 + *

只有当前会话属于登录状态才可调用 + * @return session会话 + */ + public SaSession getTokenSession() { + checkLogin(); + return getTokenSessionByToken(getTokenValue()); + } + // =================== [临时过期] 验证相关 =================== @@ -555,6 +577,24 @@ public class StpLogic { return SaTokenManager.getSaTokenDao().getSessionTimeout(getKeySession(loginId)); } + /** + * 获取当前token的专属Session剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public long getTokenSessionTimeout() { + return getTokenSessionTimeoutByTokenValue(getTokenValue()); + } + + /** + * 获取指定token的专属Session剩余有效时间 (单位: 秒) + * @param tokenValue 指定token + * @return token剩余有效时间 + */ + public long getTokenSessionTimeoutByTokenValue(String tokenValue) { + return SaTokenManager.getSaTokenDao().getSessionTimeout(getKeyTokenSession(tokenValue)); + } + + /** * 获取当前token[临时过期]剩余有效时间 (单位: 秒) * @return token[临时过期]剩余有效时间 @@ -596,6 +636,7 @@ public class StpLogic { return timeout; } + // =================== 权限验证操作 =================== @@ -694,6 +735,14 @@ public class StpLogic { public String getKeySession(Object loginId) { return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":session:" + loginId; } + /** + * 获取key: tokenValue的专属session + * @param tokenValue token值 + * @return key + */ + public String getKeyTokenSession(String tokenValue) { + return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":token-session:" + tokenValue; + } /** * 获取key: 指定token的最后操作时间 持久化 * @param tokenValue token值 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 70fbc2f9..38b97aec 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,6 +207,26 @@ public class StpUtil { return stpLogic.getSession(); } + // ---------- token专属session + + /** + * 获取指定token的专属session,如果session尚未创建,则新建并返回 + * @param tokenValue token值 + * @return session会话 + */ + public static SaSession getTokenSessionByToken(String tokenValue) { + return stpLogic.getTokenSessionByToken(tokenValue); + } + + /** + * 获取当前token的专属-session,如果session尚未创建,则新建并返回 + *

只有当前会话属于登录状态才可调用 + * @return session会话 + */ + public static SaSession getTokenSession() { + return stpLogic.getTokenSession(); + } + // =================== [临时过期] 验证相关 =================== diff --git a/sa-token-demo-springboot/pom.xml b/sa-token-demo-springboot/pom.xml index 03008c76..37d083c3 100644 --- a/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo-springboot/pom.xml @@ -33,11 +33,11 @@ - + diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index f5505e0a..db26d000 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -95,6 +95,22 @@ public class TestController { return AjaxJson.getSuccess(); } + // ---------- + // 测试token专属session, 浏览器访问: http://localhost:8081/test/getTokenSession + @RequestMapping("getTokenSession") + public AjaxJson getTokenSession() { + System.out.println("======================= 进入方法,测试会话session接口 ========================= "); + System.out.println("当前是否登录:" + StpUtil.isLogin()); + System.out.println("当前token专属session: " + StpUtil.getTokenSession().getId()); + + System.out.println("测试取值name:" + StpUtil.getTokenSession().getAttribute("name")); + StpUtil.getTokenSession().setAttribute("name", "张三"); // 写入一个值 + System.out.println("测试取值name:" + StpUtil.getTokenSession().getAttribute("name")); + + return AjaxJson.getSuccess(); + } + + // 打印当前token信息, 浏览器访问: http://localhost:8081/test/tokenInfo @RequestMapping("tokenInfo") public AjaxJson tokenInfo() {