From 200f9fe642ac08fd6a74637f3048181c86f0e015 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Tue, 23 Apr 2024 20:20:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E2=80=9C=E5=BD=93=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=8C=87=E5=AE=9A=20timeout=20=E5=B0=8F?= =?UTF-8?q?=E4=BA=8E=E5=85=A8=E5=B1=80=20timeout=20=E6=97=B6=EF=BC=8CAccou?= =?UTF-8?q?nt-Session=20=E6=9C=89=E6=95=88=E6=9C=9F=E4=B8=BA=E5=85=A8?= =?UTF-8?q?=E5=B1=80=20timeout=E2=80=9D=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82=20=E4=BC=98=E5=8C=96=20=E9=A6=96=E6=AC=A1=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=20Token-Session=20=E6=97=B6=EF=BC=8C=E5=85=B6?= =?UTF-8?q?=E6=9C=89=E6=95=88=E6=9C=9F=E5=B0=86=E4=BF=9D=E6=8C=81=E5=92=8C?= =?UTF-8?q?=20token=20=E6=9C=89=E6=95=88=E6=9C=9F=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E5=86=8D=E6=98=AF=E5=85=A8?= =?UTF-8?q?=E5=B1=80=20timeout=20=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/stp/StpLogic.java | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 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 f6b1dac2..971f5ad5 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 @@ -471,7 +471,7 @@ public class StpLogic { String tokenValue = distUsableToken(id, loginModel); // 4、获取此账号的 Account-Session , 续期 - SaSession session = getSessionByLoginId(id, true); + SaSession session = getSessionByLoginId(id, true, loginModel.getTimeoutOrGlobalConfig()); session.updateMinTimeout(loginModel.getTimeout()); // 5、在 Account-Session 上记录本次登录的 token 签名 @@ -1170,10 +1170,11 @@ public class StpLogic { * * @param sessionId SessionId * @param isCreate 是否新建 - * @param appendOperation 如果这个 SaSession 是新建的,则要追加执行的动作 + * @param timeout 如果这个 SaSession 是新建的,则使用此值作为过期值(单位:秒),可填 null,代表使用全局 timeout 值 + * @param appendOperation 如果这个 SaSession 是新建的,则要追加执行的动作,可填 null,代表无追加动作 * @return Session对象 */ - public SaSession getSessionBySessionId(String sessionId, boolean isCreate, Consumer appendOperation) { + public SaSession getSessionBySessionId(String sessionId, boolean isCreate, Long timeout, Consumer appendOperation) { // 如果提供的 sessionId 为 null,则直接返回 null if(SaFoxUtil.isEmpty(sessionId)) { @@ -1192,8 +1193,19 @@ public class StpLogic { appendOperation.accept(session); } + // 如果未提供 timeout,则根据相应规则设定默认的 timeout + if(timeout == null) { + // 如果是 Token-Session,则使用对用 token 的有效期,使 token 和 token-session 保持相同ttl,同步失效 + if(SaTokenConsts.SESSION_TYPE__TOKEN.equals(session.getType())) { + timeout = getTokenTimeout(session.getToken()); + } else { + // 否则使用全局配置的 timeout + timeout = getConfigOrGlobal().getTimeout(); + } + } + // 将这个 SaSession 入库 - getSaTokenDao().setSession(session, getConfigOrGlobal().getTimeout()); + getSaTokenDao().setSession(session, timeout); } return session; } @@ -1205,7 +1217,28 @@ public class StpLogic { * @return Session对象 */ public SaSession getSessionBySessionId(String sessionId) { - return getSessionBySessionId(sessionId, false, null); + return getSessionBySessionId(sessionId, false, null, null); + } + + /** + * 获取指定账号 id 的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回 + * + * @param loginId 账号id + * @param isCreate 是否新建 + * @param timeout 如果这个 SaSession 是新建的,则使用此值作为过期值(单位:秒),可填 null,代表使用全局 timeout 值 + * @return SaSession 对象 + */ + public SaSession getSessionByLoginId(Object loginId, boolean isCreate, Long timeout) { + if(SaFoxUtil.isEmpty(loginId)) { + throw new SaTokenException("Account-Session 获取失败:loginId 不能为空"); + } + return getSessionBySessionId(splicingKeySession(loginId), isCreate, timeout, session -> { + // 这里是该 Account-Session 首次创建时才会被执行的方法: + // 设定这个 SaSession 的各种基础信息:类型、账号体系、账号id + session.setType(SaTokenConsts.SESSION_TYPE__ACCOUNT); + session.setLoginType(getLoginType()); + session.setLoginId(loginId); + }); } /** @@ -1216,16 +1249,7 @@ public class StpLogic { * @return SaSession 对象 */ public SaSession getSessionByLoginId(Object loginId, boolean isCreate) { - if(SaFoxUtil.isEmpty(loginId)) { - throw new SaTokenException("Account-Session 获取失败:loginId 不能为空"); - } - return getSessionBySessionId(splicingKeySession(loginId), isCreate, session -> { - // 这里是该 Account-Session 首次创建时才会被执行的方法: - // 设定这个 SaSession 的各种基础信息:类型、账号体系、账号id - session.setType(SaTokenConsts.SESSION_TYPE__ACCOUNT); - session.setLoginType(getLoginType()); - session.setLoginId(loginId); - }); + return getSessionByLoginId(loginId, isCreate, null); } /** @@ -1235,7 +1259,7 @@ public class StpLogic { * @return SaSession 对象 */ public SaSession getSessionByLoginId(Object loginId) { - return getSessionByLoginId(loginId, true); + return getSessionByLoginId(loginId, true, null); } /** @@ -1271,7 +1295,8 @@ public class StpLogic { if(SaFoxUtil.isEmpty(tokenValue)) { throw new SaTokenException("Token-Session 获取失败:token 不能为空"); } - return getSessionBySessionId(splicingKeyTokenSession(tokenValue), isCreate, session -> { + // todo 待优化 + return getSessionBySessionId(splicingKeyTokenSession(tokenValue), isCreate, null, session -> { // 这里是该 Token-Session 首次创建时才会被执行的方法: // 设定这个 SaSession 的各种基础信息:类型、账号体系、Token 值 session.setType(SaTokenConsts.SESSION_TYPE__TOKEN);