From ecb18f5b45165fc91abda4ae28fa5125f3996d63 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Mon, 22 Apr 2024 18:25:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20`StpUtil.getTokenLastActiv?= =?UTF-8?q?eTime()`=20=E6=96=B9=E6=B3=95=EF=BC=8C=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=BD=93=E5=89=8D=20token=20=E6=9C=80=E5=90=8E=E6=B4=BB?= =?UTF-8?q?=E8=B7=83=E6=97=B6=E9=97=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/stp/StpLogic.java | 58 +++++++++++++------ .../java/cn/dev33/satoken/stp/StpUtil.java | 11 +++- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index b25f66a4..f6b1dac2 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -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) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index 8def64bf..aaf5ec7a 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -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(); + } + // ------------------- 会话管理 -------------------