新增Token有效期timeout续期方法

This commit is contained in:
click33 2022-02-07 13:16:11 +08:00
parent be7a043196
commit 9e47461a0a
3 changed files with 100 additions and 17 deletions

View File

@ -8,6 +8,7 @@ import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import cn.dev33.satoken.SaManager; import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.fun.SaRetFunction; import cn.dev33.satoken.fun.SaRetFunction;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
@ -216,8 +217,10 @@ public class SaSession implements Serializable {
* @param minTimeout 过期时间 (单位: ) * @param minTimeout 过期时间 (单位: )
*/ */
public void updateMinTimeout(long minTimeout) { public void updateMinTimeout(long minTimeout) {
if(getTimeout() < minTimeout) { long min = trans(minTimeout);
SaManager.getSaTokenDao().updateSessionTimeout(this.id, minTimeout); long curr = trans(getTimeout());
if(curr < min) {
updateTimeout(minTimeout);
} }
} }
@ -226,12 +229,21 @@ public class SaSession implements Serializable {
* @param maxTimeout 过期时间 (单位: ) * @param maxTimeout 过期时间 (单位: )
*/ */
public void updateMaxTimeout(long maxTimeout) { public void updateMaxTimeout(long maxTimeout) {
if(getTimeout() > maxTimeout) { long max = trans(maxTimeout);
SaManager.getSaTokenDao().updateSessionTimeout(this.id, maxTimeout); long curr = trans(getTimeout());
if(curr > max) {
updateTimeout(maxTimeout);
} }
} }
/**
* value为 -1 时返回 Long.MAX_VALUE否则原样返回
* @param value /
* @return /
*/
protected long trans(long value) {
return value == SaTokenDao.NEVER_EXPIRE ? Long.MAX_VALUE : value;
}
// ----------------------- 存取值 (类型转换) // ----------------------- 存取值 (类型转换)

View File

@ -681,7 +681,7 @@ public class StpLogic {
*/ */
public Object getLoginIdByToken(String tokenValue) { public Object getLoginIdByToken(String tokenValue) {
// token为空时直接返回null // token为空时直接返回null
if(tokenValue == null) { if(SaFoxUtil.isEmpty(tokenValue)) {
return null; return null;
} }
// loginId为无效值时直接返回null // loginId为无效值时直接返回null
@ -883,7 +883,7 @@ public class StpLogic {
*/ */
protected void setLastActivityToNow(String tokenValue) { protected void setLastActivityToNow(String tokenValue) {
// 如果token == null 或者 设置了[永不过期], 则立即返回 // 如果token == null 或者 设置了[永不过期], 则立即返回
if(tokenValue == null || getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) { if(tokenValue == null || isOpenActivityCheck() == false) {
return; return;
} }
// [最后操作时间]标记为当前时间戳 // [最后操作时间]标记为当前时间戳
@ -896,7 +896,7 @@ public class StpLogic {
*/ */
protected void clearLastActivity(String tokenValue) { protected void clearLastActivity(String tokenValue) {
// 如果token == null 或者 设置了[永不过期], 则立即返回 // 如果token == null 或者 设置了[永不过期], 则立即返回
if(tokenValue == null || getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) { if(tokenValue == null || isOpenActivityCheck() == false) {
return; return;
} }
// 删除[最后操作时间] // 删除[最后操作时间]
@ -911,7 +911,7 @@ public class StpLogic {
*/ */
public void checkActivityTimeout(String tokenValue) { public void checkActivityTimeout(String tokenValue) {
// 如果token == null 或者 设置了[永不过期], 则立即返回 // 如果token == null 或者 设置了[永不过期], 则立即返回
if(tokenValue == null || getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) { if(tokenValue == null || isOpenActivityCheck() == false) {
return; return;
} }
// 如果本次请求已经有了[检查标记], 则立即返回 // 如果本次请求已经有了[检查标记], 则立即返回
@ -949,7 +949,7 @@ public class StpLogic {
*/ */
public void updateLastActivityToNow(String tokenValue) { public void updateLastActivityToNow(String tokenValue) {
// 如果token == null 或者 设置了[永不过期], 则立即返回 // 如果token == null 或者 设置了[永不过期], 则立即返回
if(tokenValue == null || getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) { if(tokenValue == null || isOpenActivityCheck() == false) {
return; return;
} }
getSaTokenDao().update(splicingKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis())); getSaTokenDao().update(splicingKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis()));
@ -964,7 +964,6 @@ public class StpLogic {
updateLastActivityToNow(getTokenValue()); updateLastActivityToNow(getTokenValue());
} }
// ------------------- 过期时间相关 ------------------- // ------------------- 过期时间相关 -------------------
/** /**
@ -1037,7 +1036,7 @@ public class StpLogic {
return SaTokenDao.NOT_VALUE_EXPIRE; return SaTokenDao.NOT_VALUE_EXPIRE;
} }
// 如果设置了永不过期, 则返回 -1 // 如果设置了永不过期, 则返回 -1
if(getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) { if(isOpenActivityCheck() == false) {
return SaTokenDao.NEVER_EXPIRE; return SaTokenDao.NEVER_EXPIRE;
} }
// ------ 开始查询 // ------ 开始查询
@ -1059,6 +1058,53 @@ public class StpLogic {
return timeout; return timeout;
} }
/**
* 对当前 Token timeout 值进行续期
* @param timeout 要修改成为的有效时间 (单位: )
*/
public void renewTimeout(long timeout) {
// 续期 db 数据
String tokenValue = getTokenValue();
renewTimeout(tokenValue, timeout);
// 续期客户端Cookie有效期
if(getConfig().getIsReadCookie()) {
setTokenValueToCookie(tokenValue, (int)timeout);
}
}
/**
* 对指定 Token timeout 值进行续期
* @param tokenValue 指定token
* @param timeout 要修改成为的有效时间 (单位: )
*/
public void renewTimeout(String tokenValue, long timeout) {
// Token 指向的 LoginId 异常时不进行任何操作
Object loginId = getLoginIdByToken(tokenValue);
if(loginId == null) {
return;
}
SaTokenDao dao = getSaTokenDao();
// 续期 Token 有效期
dao.updateTimeout(splicingKeyTokenValue(tokenValue), timeout);
// 续期 Token-Session 有效期
SaSession tokenSession = getTokenSessionByToken(tokenValue, false);
if(tokenSession != null) {
tokenSession.updateTimeout(timeout);
}
// 续期指向的 User-Session 有效期
getSessionByLoginId(loginId).updateMinTimeout(timeout);
// Token-Activity 活跃检查相关
if(isOpenActivityCheck()) {
dao.updateTimeout(splicingKeyLastActivityTime(tokenValue), timeout);
}
}
// ------------------- 角色验证操作 ------------------- // ------------------- 角色验证操作 -------------------
@ -1647,7 +1693,7 @@ public class StpLogic {
} }
/** /**
* 拼接key tokenValue的专属session * 拼接key tokenValue的Token-Session
* @param tokenValue token值 * @param tokenValue token值
* @return key * @return key
*/ */
@ -1709,7 +1755,15 @@ public class StpLogic {
public boolean getConfigOfIsShare() { public boolean getConfigOfIsShare() {
return getConfig().getIsShare(); return getConfig().getIsShare();
} }
/**
* 返回全局配置是否开启了Token 活跃校验
* @return /
*/
public boolean isOpenActivityCheck() {
return getConfig().getActivityTimeout() != SaTokenDao.NEVER_EXPIRE;
}
/** /**
* 返回持久化对象 * 返回持久化对象
* @return / * @return /
@ -1737,7 +1791,8 @@ public class StpLogic {
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-2 * <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-2
* @param loginId 账号id * @param loginId 账号id
*/ */
public void logoutByLoginId(Object loginId) { @Deprecated
public void logoutByLoginId(Object loginId) {
this.kickout(loginId); this.kickout(loginId);
} }
@ -1749,7 +1804,8 @@ public class StpLogic {
* @param loginId 账号id * @param loginId 账号id
* @param device 设备标识 (填null代表所有注销设备) * @param device 设备标识 (填null代表所有注销设备)
*/ */
public void logoutByLoginId(Object loginId, String device) { @Deprecated
public void logoutByLoginId(Object loginId, String device) {
this.kickout(loginId, device); this.kickout(loginId, device);
} }

View File

@ -436,8 +436,23 @@ public class StpUtil {
public static long getTokenActivityTimeout() { public static long getTokenActivityTimeout() {
return stpLogic.getTokenActivityTimeout(); return stpLogic.getTokenActivityTimeout();
} }
/**
* 对当前 Token timeout 值进行续期
* @param timeout 要修改成为的有效时间 (单位: )
*/
public static void renewTimeout(long timeout) {
stpLogic.renewTimeout(timeout);
}
/**
* 对指定 Token timeout 值进行续期
* @param tokenValue 指定token
* @param timeout 要修改成为的有效时间 (单位: )
*/
public static void renewTimeout(String tokenValue, long timeout) {
stpLogic.renewTimeout(tokenValue, timeout);
}
// =================== 角色验证操作 =================== // =================== 角色验证操作 ===================