Quellcode durchsuchen

Merge branch 'system-zjy' of uskycloud/usky-cloud into master

zhaojinyu vor 22 Stunden
Ursprung
Commit
3676562dbc

+ 32 - 15
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java

@@ -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);
         }