From ecb9599b25fde0e3569b46e667ca1990294f8665 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 16 Dec 2025 10:26:21 +0800
Subject: [PATCH] 修复【在线用户强制退出正在使用的账号】bug
---
ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java | 32 ++++++++++++++++++++++++++++++--
1 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java b/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
index 5250cf1..682a1ab 100644
--- a/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
+++ b/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
@@ -26,7 +26,7 @@
/**
* token验证处理
*
- * @author ruoyi
+ * @author ard
*/
@Component
public class TokenService
@@ -44,6 +44,10 @@
// 令牌有效期(默认30分钟)
@Value("${token.expireTime}")
private int expireTime;
+
+ // 是否允许账户多终端同时登录(true允许 false不允许)
+ @Value("${token.soloLogin}")
+ private boolean soloLogin;
protected static final long MILLIS_SECOND = 1000;
@@ -96,12 +100,17 @@
/**
* 删除用户身份信息
*/
- public void delLoginUser(String token)
+ public void delLoginUser(String token, Long userId)
{
if (StringUtils.isNotEmpty(token))
{
String userKey = getTokenKey(token);
redisCache.deleteObject(userKey);
+ }
+ if (!soloLogin && StringUtils.isNotNull(userId))
+ {
+ String userIdKey = getUserIdKey(userId);
+ redisCache.deleteObject(userIdKey);
}
}
@@ -151,6 +160,12 @@
// 根据uuid将loginUser缓存
String userKey = getTokenKey(loginUser.getToken());
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+ if (!soloLogin)
+ {
+ // 缓存用户唯一标识,防止同一帐号,同时登录
+ String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
+ redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
+ }
}
/**
@@ -228,4 +243,17 @@
{
return CacheConstants.LOGIN_TOKEN_KEY + uuid;
}
+
+ private String getUserIdKey(Long userId)
+ {
+ return CacheConstants.LOGIN_USERID_KEY + userId;
+ }
+
+ public LoginUser getLoginUserByUserId(Long userId) {
+ String userIdKey = getUserIdKey(userId);
+ String tokenKey = redisCache.getCacheObject(userIdKey);
+ if (tokenKey == null) return null;
+ return redisCache.getCacheObject(tokenKey);
+ }
+
}
--
Gitblit v1.9.3