chore(core): 优化 active-timeout 的检查与续期操作,同一请求内只会检查与续期一次

This commit is contained in:
click33
2024-12-11 17:34:33 +08:00
parent 80879ba3b8
commit d8bd196d24

View File

@@ -982,16 +982,23 @@ public class StpLogic {
throw NotLoginException.newInstance(loginType, KICK_OUT, KICK_OUT_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11015); throw NotLoginException.newInstance(loginType, KICK_OUT, KICK_OUT_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11015);
} }
// 7、检查此 token 的最后活跃时间是否已经超过了 active-timeout 的限制如果是则代表其已被冻结需要抛出token 已被冻结 // 7、token 活跃频率检查
if(isOpenCheckActiveTimeout()) { if(isOpenCheckActiveTimeout()) {
// storage.get(key, () -> {}) 可以避免一次请求多次校验,造成不必要的性能消耗
SaHolder.getStorage().get(SaTokenConsts.TOKEN_ACTIVE_TIMEOUT_CHECKED_KEY, () -> {
// 7.1、检查此 token 的最后活跃时间是否已经超过了 active-timeout 的限制如果是则代表其已被冻结需要抛出token 已被冻结
checkActiveTimeout(tokenValue); checkActiveTimeout(tokenValue);
// ------ 至此loginId 已经是一个合法的值,代表当前会话是一个正常的登录状态了 // ------ 至此loginId 已经是一个合法的值,代表当前会话是一个正常的登录状态了
// 8、如果配置了自动续签功能, 则: 更新这个 token 的最后活跃时间 (注意此处的续签是在续 active-timeout而非 timeout // 7.2、如果配置了自动续签功能, 则: 更新这个 token 的最后活跃时间 (注意此处的续签是在续 active-timeout而非 timeout
if(getConfigOrGlobal().getAutoRenew()) { if(getConfigOrGlobal().getAutoRenew()) {
updateLastActiveToNow(tokenValue); updateLastActiveToNow(tokenValue);
} }
return true;
});
} }
// 9、返回 loginId // 9、返回 loginId
@@ -1528,26 +1535,18 @@ public class StpLogic {
*/ */
public void checkActiveTimeout(String tokenValue) { public void checkActiveTimeout(String tokenValue) {
// storage.get(key, () -> {}) 可以避免一次请求多次校验,造成不必要的性能消耗
SaStorage storage = SaHolder.getStorage();
storage.get(SaTokenConsts.TOKEN_ACTIVE_TIMEOUT_CHECKED_KEY, () -> {
// 1、获取这个 token 的剩余活跃有效期 // 1、获取这个 token 的剩余活跃有效期
long activeTimeout = getTokenActiveTimeoutByToken(tokenValue); long activeTimeout = getTokenActiveTimeoutByToken(tokenValue);
// 2、值为 -1 代表此 token 已经被设置永不冻结,无须继续验证 // 2、值为 -1 代表此 token 已经被设置永不冻结,无须继续验证
if(activeTimeout == SaTokenDao.NEVER_EXPIRE) { if(activeTimeout == SaTokenDao.NEVER_EXPIRE) {
return true; return;
} }
// 3、值为 -2 代表已被冻结,此时需要抛出异常 // 3、值为 -2 代表已被冻结,此时需要抛出异常
if(activeTimeout == SaTokenDao.NOT_VALUE_EXPIRE) { if(activeTimeout == SaTokenDao.NOT_VALUE_EXPIRE) {
throw NotLoginException.newInstance(loginType, TOKEN_FREEZE, TOKEN_FREEZE_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11016); throw NotLoginException.newInstance(loginType, TOKEN_FREEZE, TOKEN_FREEZE_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11016);
} }
// --- 验证通过
return true;
});
} }
/** /**