mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-12-21 19:09:45 +08:00
chore(core): 优化 active-timeout 的检查与续期操作,同一请求内只会检查与续期一次
This commit is contained in:
@@ -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;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user