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);
}
// 7检查此 token 的最后活跃时间是否已经超过了 active-timeout 的限制如果是则代表其已被冻结需要抛出token 已被冻结
// 7token 活跃频率检查
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);
}
}
/**