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 c34a578a..f6842561 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 @@ -2388,6 +2388,56 @@ public class StpLogic { session.forEachTerminalList(function); } + /** + * 返回当前 token 指向的 SaTerminalInfo 设备信息,如果 token 无效则返回 null + * + * @return / + */ + public SaTerminalInfo getTerminalInfo() { + return getTerminalInfoByToken(getTokenValue()); + } + + /** + * 返回指定 token 指向的 SaTerminalInfo 设备信息,如果 Token 无效则返回 null + * + * @param tokenValue 指定 token + * @return / + */ + public SaTerminalInfo getTerminalInfoByToken(String tokenValue) { + // 1、如果 token 为 null,直接提前返回 + if(SaFoxUtil.isEmpty(tokenValue)) { + return null; + } + + // 2、判断 Token 是否有效 + Object loginId = getLoginIdNotHandle(tokenValue); + if( ! isValidLoginId(loginId)) { + return null; + } + + // 3、判断 Account-Session 是否存在 + SaSession session = getSessionByLoginId(loginId, false); + if(session == null) { + return null; + } + + // 4、判断 Token 是否已被冻结 + if(isFreeze(tokenValue)) { + return null; + } + + // 5、遍历 Account-Session 上的客户端 token 列表,寻找当前 token 对应的设备类型 + List terminalList = session.terminalListCopy(); + for (SaTerminalInfo terminal : terminalList) { + if(terminal.getTokenValue().equals(tokenValue)) { + return terminal; + } + } + + // 6、没有找到,还是返回 null + return null; + } + /** * 返回当前会话的登录设备类型 * @@ -2404,38 +2454,28 @@ public class StpLogic { * @return 当前令牌的登录设备类型 */ public String getLoginDeviceTypeByToken(String tokenValue) { - // 1、如果 token 为 null,直接提前返回 - if(SaFoxUtil.isEmpty(tokenValue)) { - return null; - } + SaTerminalInfo terminalInfo = getTerminalInfoByToken(tokenValue); + return terminalInfo == null ? null : terminalInfo.getDeviceType(); + } - // 2、获取此 token 对应的 loginId,如果为null,或者此token已被冻结,直接返回null - Object loginId = getLoginIdNotHandle(tokenValue); - if( ! isValidLoginId(loginId)) { - return null; - } - if(getTokenActiveTimeoutByToken(tokenValue) == SaTokenDao.NOT_VALUE_EXPIRE ) { - return null; - } + /** + * 返回当前会话的登录设备 ID + * + * @return / + */ + public String getLoginDeviceId() { + return getLoginDeviceIdByToken(getTokenValue()); + } - // 3、获取这个账号的 Account-Session - SaSession session = getSessionByLoginId(loginId, false); - - // 4、为 null 说明尚未登录,当然也就不存在什么设备类型,直接返回 null - if(session == null) { - return null; - } - - // 5、遍历 Account-Session 上的客户端 token 列表,寻找当前 token 对应的设备类型 - List terminalList = session.terminalListCopy(); - for (SaTerminalInfo terminal : terminalList) { - if(terminal.getTokenValue().equals(tokenValue)) { - return terminal.getDeviceType(); - } - } - - // 6、没有找到,还是返回 null - return null; + /** + * 返回指定 token 会话的登录设备 ID + * + * @param tokenValue 指定token + * @return / + */ + public String getLoginDeviceIdByToken(String tokenValue) { + SaTerminalInfo terminalInfo = getTerminalInfoByToken(tokenValue); + return terminalInfo == null ? null : terminalInfo.getDeviceId(); } /** 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 26aa78a7..3dffa941 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 @@ -678,6 +678,15 @@ public class StpUtil { stpLogic.checkActiveTimeout(); } + /** + * 获取当前 token 的最后活跃时间(13位时间戳),如果不存在则返回 -2 + * + * @return / + */ + public static long getTokenLastActiveTime() { + return stpLogic.getTokenLastActiveTime(); + } + // ------------------- 过期时间相关 ------------------- @@ -1010,6 +1019,25 @@ public class StpUtil { stpLogic.forEachTerminalList(loginId, function); } + /** + * 返回当前 token 指向的 SaTerminalInfo 设备信息,如果 token 无效则返回 null + * + * @return / + */ + public static SaTerminalInfo getTerminalInfo() { + return stpLogic.getTerminalInfo(); + } + + /** + * 返回指定 token 指向的 SaTerminalInfo 设备信息,如果 Token 无效则返回 null + * + * @param tokenValue 指定 token + * @return / + */ + public static SaTerminalInfo getTerminalInfoByToken(String tokenValue) { + return stpLogic.getTerminalInfoByToken(tokenValue); + } + /** * 返回当前会话的登录设备类型 * @@ -1030,12 +1058,22 @@ public class StpUtil { } /** - * 获取当前 token 的最后活跃时间(13位时间戳),如果不存在则返回 -2 + * 返回当前会话的登录设备 ID * * @return / */ - public static long getTokenLastActiveTime() { - return stpLogic.getTokenLastActiveTime(); + public static String getLoginDeviceId() { + return stpLogic.getLoginDeviceId(); + } + + /** + * 返回指定 token 会话的登录设备 ID + * + * @param tokenValue 指定token + * @return / + */ + public static String getLoginDeviceIdByToken(String tokenValue) { + return stpLogic.getLoginDeviceIdByToken(tokenValue); } /**