From d8bd196d247d83e13beebd5bcff1e062292e9655 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Wed, 11 Dec 2024 17:34:33 +0800 Subject: [PATCH] =?UTF-8?q?chore(core):=20=E4=BC=98=E5=8C=96=20active-time?= =?UTF-8?q?out=20=E7=9A=84=E6=A3=80=E6=9F=A5=E4=B8=8E=E7=BB=AD=E6=9C=9F?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=EF=BC=8C=E5=90=8C=E4=B8=80=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=86=85=E5=8F=AA=E4=BC=9A=E6=A3=80=E6=9F=A5=E4=B8=8E=E7=BB=AD?= =?UTF-8?q?=E6=9C=9F=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/stp/StpLogic.java | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 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 280376fd..f2df96cb 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 @@ -982,16 +982,23 @@ public class StpLogic { throw NotLoginException.newInstance(loginType, KICK_OUT, KICK_OUT_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11015); } - // 7、检查此 token 的最后活跃时间是否已经超过了 active-timeout 的限制,如果是则代表其已被冻结,需要抛出:token 已被冻结 + // 7、token 活跃频率检查 if(isOpenCheckActiveTimeout()) { - checkActiveTimeout(tokenValue); + // storage.get(key, () -> {}) 可以避免一次请求多次校验,造成不必要的性能消耗 + SaHolder.getStorage().get(SaTokenConsts.TOKEN_ACTIVE_TIMEOUT_CHECKED_KEY, () -> { - // ------ 至此,loginId 已经是一个合法的值,代表当前会话是一个正常的登录状态了 + // 7.1、检查此 token 的最后活跃时间是否已经超过了 active-timeout 的限制,如果是则代表其已被冻结,需要抛出:token 已被冻结 + checkActiveTimeout(tokenValue); - // 8、如果配置了自动续签功能, 则: 更新这个 token 的最后活跃时间 (注意此处的续签是在续 active-timeout,而非 timeout) - if(getConfigOrGlobal().getAutoRenew()) { - updateLastActiveToNow(tokenValue); - } + // ------ 至此,loginId 已经是一个合法的值,代表当前会话是一个正常的登录状态了 + + // 7.2、如果配置了自动续签功能, 则: 更新这个 token 的最后活跃时间 (注意此处的续签是在续 active-timeout,而非 timeout) + if(getConfigOrGlobal().getAutoRenew()) { + updateLastActiveToNow(tokenValue); + } + + return true; + }); } // 9、返回 loginId @@ -1528,26 +1535,18 @@ public class StpLogic { */ public void checkActiveTimeout(String tokenValue) { - // storage.get(key, () -> {}) 可以避免一次请求多次校验,造成不必要的性能消耗 - SaStorage storage = SaHolder.getStorage(); - storage.get(SaTokenConsts.TOKEN_ACTIVE_TIMEOUT_CHECKED_KEY, () -> { + // 1、获取这个 token 的剩余活跃有效期 + long activeTimeout = getTokenActiveTimeoutByToken(tokenValue); - // 1、获取这个 token 的剩余活跃有效期 - long activeTimeout = getTokenActiveTimeoutByToken(tokenValue); + // 2、值为 -1 代表此 token 已经被设置永不冻结,无须继续验证 + if(activeTimeout == SaTokenDao.NEVER_EXPIRE) { + return; + } - // 2、值为 -1 代表此 token 已经被设置永不冻结,无须继续验证 - if(activeTimeout == SaTokenDao.NEVER_EXPIRE) { - return true; - } - - // 3、值为 -2 代表已被冻结,此时需要抛出异常 - if(activeTimeout == SaTokenDao.NOT_VALUE_EXPIRE) { - throw NotLoginException.newInstance(loginType, TOKEN_FREEZE, TOKEN_FREEZE_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11016); - } - - // --- 验证通过 - return true; - }); + // 3、值为 -2 代表已被冻结,此时需要抛出异常 + if(activeTimeout == SaTokenDao.NOT_VALUE_EXPIRE) { + throw NotLoginException.newInstance(loginType, TOKEN_FREEZE, TOKEN_FREEZE_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11016); + } } /**