mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-04-05 17:37:53 +08:00
新增Token有效期timeout续期方法
This commit is contained in:
parent
be7a043196
commit
9e47461a0a
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------- 存取值 (类型转换)
|
// ----------------------- 存取值 (类型转换)
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
// =================== 角色验证操作 ===================
|
// =================== 角色验证操作 ===================
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user