|
@@ -136,7 +136,8 @@ public class AsyncFactory
|
|
|
|
|
|
try {
|
|
|
// 获取所有与该用户相关的token键
|
|
|
- Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
|
|
|
+ String pattern = CacheConstants.LOGIN_TOKEN_KEY + "*";
|
|
|
+ Collection<String> keys = redisService.keys(pattern);
|
|
|
if (keys == null || keys.isEmpty()) {
|
|
|
sys_user_logger.warn("Redis密钥为null或为空");
|
|
|
return;
|
|
@@ -160,30 +161,46 @@ public class AsyncFactory
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 找到最新的token
|
|
|
- Map<String, List<LoginUser>> groupedTokens = new HashMap<>();
|
|
|
+ // 分组逻辑:根据OS和Browser分组
|
|
|
+ Map<String, List<Map.Entry<String, LoginUser>>> groupedTokens = new HashMap<>();
|
|
|
for (Map.Entry<String, LoginUser> entry : userTokens.entrySet()) {
|
|
|
- String osBrowserKey = entry.getValue().getOs() + "-" + entry.getValue().getBrowser();
|
|
|
- List<LoginUser> tokenList = groupedTokens.computeIfAbsent(osBrowserKey, k -> new ArrayList<>());
|
|
|
- tokenList.add(entry.getValue());
|
|
|
+ LoginUser loginUser = entry.getValue();
|
|
|
+ String os = StringUtils.isEmpty(loginUser.getOs()) ? "未知" : loginUser.getOs();
|
|
|
+ String browser = StringUtils.isEmpty(loginUser.getBrowser()) ? "未知" : loginUser.getBrowser();
|
|
|
+ String osBrowserKey = os + "-" + browser;
|
|
|
+ groupedTokens.computeIfAbsent(osBrowserKey, k -> new ArrayList<>()).add(entry);
|
|
|
}
|
|
|
|
|
|
- // OS和Browser组合,保留最新的两条token
|
|
|
+ // 删除逻辑:保留最新的两条token,删除其他token
|
|
|
List<String> tokensToDelete = new ArrayList<>();
|
|
|
- for (List<LoginUser> tokenList : groupedTokens.values()) {
|
|
|
- Collections.sort(tokenList, Comparator.comparing(LoginUser::getLoginTime).reversed());
|
|
|
- for (int i = 2; i < tokenList.size(); i++) {
|
|
|
- tokensToDelete.add(redisService.getCacheObject(tokenList.get(i).getToken()));
|
|
|
+ for (List<Map.Entry<String, LoginUser>> entryList : groupedTokens.values()) {
|
|
|
+ // 按照登录时间排序,保留最新的两条token
|
|
|
+ entryList.sort((e1, e2) ->
|
|
|
+ e2.getValue().getLoginTime().compareTo(e1.getValue().getLoginTime())
|
|
|
+ );
|
|
|
+ for (int i = 3; i < entryList.size(); i++) {
|
|
|
+ String keyToDelete = entryList.get(i).getKey();
|
|
|
+ tokensToDelete.add(keyToDelete);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 删除其他token
|
|
|
- for (String tokenKey : tokensToDelete) {
|
|
|
- boolean deleted = redisService.deleteObject(tokenKey);
|
|
|
- System.out.println("Deleted Token Key: " + tokenKey + ", Result: " + deleted);
|
|
|
+ sys_user_logger.info("要删除的token列表: {}", tokensToDelete);
|
|
|
+ for (String keyToDelete : tokensToDelete) {
|
|
|
+ if (keyToDelete != null) {
|
|
|
+ // 再次检查键是否存在
|
|
|
+ if (redisService.hasKey(keyToDelete)) {
|
|
|
+ boolean deleted = redisService.deleteObject(keyToDelete);
|
|
|
+ sys_user_logger.info("Deleted Token Key: " + keyToDelete + ", Result: " + deleted);
|
|
|
+ } else {
|
|
|
+ sys_user_logger.warn("尝试删除的token键 {} 不存在,跳过删除操作", keyToDelete);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sys_user_logger.warn("尝试删除的token键为null,跳过删除操作");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- sys_user_logger.info("用户 {} 的token已清理,仅保留最新的两条token: {}", username, tokensToDelete.size());
|
|
|
+ sys_user_logger.info("用户 {} 的token已清理,仅保留最新的两条token: 已删除{}个", username, tokensToDelete.size());
|
|
|
} catch (Exception ex) {
|
|
|
sys_user_logger.error("清理用户 {} 的token时发生错误", username, ex);
|
|
|
}
|