新增 StpUtil.getTokenLastActiveTime() 方法,获取当前 token 最后活跃时间。

This commit is contained in:
click33 2024-04-22 18:25:59 +08:00
parent d238eea60d
commit ecb18f5b45
2 changed files with 49 additions and 20 deletions

View File

@ -1538,6 +1538,40 @@ public class StpLogic {
return activeTimeout;
}
/**
* 获取指定 token 的最后活跃时间13位时间戳如果不存在则返回 -2
*
* @param tokenValue 指定token
* @return /
*/
public long getTokenLastActiveTime(String tokenValue) {
// 1如果提供的 token null则返回 -2
if(SaFoxUtil.isEmpty(tokenValue)) {
return SaTokenDao.NOT_VALUE_EXPIRE;
}
// 2获取这个 token 的最后活跃时间13位时间戳
String key = splicingKeyLastActiveTime(tokenValue);
String lastActiveTimeString = getSaTokenDao().get(key);
// 3查不到返回-2
if(lastActiveTimeString == null) {
return SaTokenDao.NOT_VALUE_EXPIRE;
}
// 4根据逗号切割字符串
return new SaValue2Box(lastActiveTimeString).getValue1AsLong();
}
/**
* 获取当前 token 的最后活跃时间13位时间戳如果不存在则返回 -2
*
* @return /
*/
public long getTokenLastActiveTime() {
return getTokenLastActiveTime(getTokenValue());
}
// ------------------- 过期时间相关 -------------------
@ -1630,26 +1664,14 @@ public class StpLogic {
return SaTokenDao.NEVER_EXPIRE;
}
// 如果提供的 token null则返回 -2
if(SaFoxUtil.isEmpty(tokenValue)) {
return SaTokenDao.NOT_VALUE_EXPIRE;
}
// ------ 开始查询
// 1先获取这个 token 的最后活跃时间13位时间戳
String key = splicingKeyLastActiveTime(tokenValue);
String lastActiveTimeString = getSaTokenDao().get(key);
// 先获取这个 token 的最后活跃时间13位时间戳
long lastActiveTime = getTokenLastActiveTime(tokenValue);
if(lastActiveTime == SaTokenDao.NOT_VALUE_EXPIRE) {
return SaTokenDao.NOT_VALUE_EXPIRE;
}
// 2如果查不到返回-2
if(lastActiveTimeString == null) {
return SaTokenDao.NOT_VALUE_EXPIRE;
}
// 3计算最后活跃时间 距离 此时此刻 的时间差
// 计算公式为: (当前时间 - 最后活跃时间) / 1000
SaValue2Box box = new SaValue2Box(lastActiveTimeString);
long lastActiveTime = box.getValue1AsLong();
// 实际时间差
long timeDiff = (System.currentTimeMillis() - lastActiveTime) / 1000;
// token 允许的时间差
@ -1659,7 +1681,7 @@ public class StpLogic {
return SaTokenDao.NEVER_EXPIRE;
}
// 4校验这个时间差是否超过了允许的值
// 校验这个时间差是否超过了允许的值
// 计算公式为: 允许的最大时间差 - 实际时间差判断是否 < 0 如果是则代表已经被冻结 返回-2
long activeTimeout = allowTimeDiff - timeDiff;
if(activeTimeout < 0) {

View File

@ -16,12 +16,10 @@
package cn.dev33.satoken.stp;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign;
import cn.dev33.satoken.util.SaFoxUtil;
import java.util.List;
@ -856,6 +854,15 @@ public class StpUtil {
return stpLogic.getLoginDeviceByToken(tokenValue);
}
/**
* 获取当前 token 的最后活跃时间13位时间戳如果不存在则返回 -2
*
* @return /
*/
public static long getTokenLastActiveTime() {
return stpLogic.getTokenLastActiveTime();
}
// ------------------- 会话管理 -------------------