Просмотр исходного кода

调整详情传参为用户id,修改一键强退用户所有token接口直接调用详情接口进行强退所有

ZJY 5 месяцев назад
Родитель
Сommit
16c34f89c6

+ 57 - 34
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserOnlineController.java

@@ -5,15 +5,18 @@ import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.constants.CacheConstants;
 import com.usky.common.core.utils.StringUtils;
 import com.usky.common.redis.core.RedisService;
-import com.usky.common.security.annotation.RequiresPermissions;
 import com.usky.system.controller.web.page.TableDataInfo;
 import com.usky.system.domain.SysUserOnline;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.ISysUserOnlineService;
+import org.json.JSONArray;
+import org.json.JSONObject;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.slf4j.Logger;
+import org.springframework.web.client.RestTemplate;
 
 /**
  * 在线用户监控
@@ -48,8 +51,8 @@ public class SysUserOnlineController {
         try {
             Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
             if (keys == null || keys.isEmpty()) {
-                logger.error("Redis keys is null or empty");
-                return ApiResult.error("SYS-0000", "Redis keys is null or empty");
+                logger.error("Redis密钥为null或为空");
+                return ApiResult.error("SYS-0000", "Redis密钥为null或为空");
             }
             Map<String, List<SysUserOnline>> userOnlineMap = new HashMap<>();
 
@@ -94,27 +97,27 @@ public class SysUserOnlineController {
 
             return ApiResult.success(getDataTable(pageList, page, size, total));
         } catch (Exception ex) {
-            logger.error("Error processing /online/list", ex);
-            return ApiResult.error("SYS-0001", "Internal system error", ex.getMessage());
+            logger.error("处理/online/list错误", ex);
+            return ApiResult.error("SYS-0001", "内部系统错误", ex.getMessage());
         }
     }
 
     @GetMapping("/history")
-    public ApiResult<TableDataInfo> listOtherLogins(@RequestParam String userName,
+    public ApiResult<TableDataInfo> listOtherLogins(@RequestParam Long userid,
                                                     @RequestParam(required = false, defaultValue = "1") Integer page,
                                                     @RequestParam(required = false, defaultValue = "10") Integer size) {
         try {
             Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
             if (keys == null || keys.isEmpty()) {
-                logger.error("Redis keys is null or empty");
-                return ApiResult.error("SYS-0000", "Redis keys is null or empty");
+                logger.error("Redis密钥为null或为空");
+                return ApiResult.error("SYS-0000", "Redis密钥为null或为空");
             }
             List<SysUserOnline> userOnlineList = new ArrayList<>();
 
             for (String key : keys) {
                 if (redisService.hasKey(key)) {
                     LoginUser user = redisService.getCacheObject(key);
-                    if (user != null && user.getUsername().equals(userName)) {
+                    if (user != null && user.getUserid().equals(userid)) {
                         SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
                         if (online != null) {
                             userOnlineList.add(online);
@@ -137,8 +140,8 @@ public class SysUserOnlineController {
 
             return ApiResult.success(getDataTable(pageList, page, size, total));
         } catch (Exception ex) {
-            logger.error("Error processing /online/listOtherLogins", ex);
-            return ApiResult.error("SYS-0001", "Internal system error", ex.getMessage());
+            logger.error("处理/online/listOtherLogins错误", ex);
+            return ApiResult.error("SYS-0001", "内部服务器错误", ex.getMessage());
         }
     }
 
@@ -150,46 +153,66 @@ public class SysUserOnlineController {
     public ApiResult forceLogout(@PathVariable String tokenId) {
         try {
             if (StringUtils.isBlank(tokenId)) {
-                logger.error("Token ID is blank for force logout");
-                return ApiResult.error("SYS-0004", "Token ID is required for force logout");
+                logger.error("强制注销时Token为空");
+                return ApiResult.error("SYS-0004", "强制注销需要Token");
             }
 
             String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
             boolean deleted = redisService.deleteObject(key);
             if (deleted) {
-                logger.info("User with tokenId {} has been forcibly logged out.", tokenId);
+                logger.info("tokenId为 {} 的用户已被强制注销.", tokenId);
                 return ApiResult.success();
             } else {
-                logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
-                return ApiResult.error("SYS-0002", "Session not found or already deleted");
+                logger.warn("未能找到并删除tokenId为 {} 的用户会话", tokenId);
+                return ApiResult.error("SYS-0002", "未找到会话或已删除会话");
             }
         } catch (Exception ex) {
-            logger.error("Error processing forceLogout for tokenId {}", tokenId, ex);
-            return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
+            logger.error("处理tokenId {} 的forceLogout时出错", tokenId, ex);
+            return ApiResult.error("SYS-0003", "强制注销时出现内部系统错误", ex.getMessage());
         }
     }
 
     @DeleteMapping("/logoutMany")
-    public ApiResult forceLogoutMany(@RequestBody List<String> tokenIds) {
-        for (String tokenId : tokenIds) {
-            try {
-                if (StringUtils.isBlank(tokenId)) {
-                    logger.error("Token ID is blank for force logout");
-                    continue;
+    public ApiResult forceLogoutMany(@RequestParam Long userid,
+                                     @RequestParam(required = false, defaultValue = "1") Integer page,
+                                     @RequestParam(required = false, defaultValue = "999") Integer size) {
+        try {
+            // 调用 /history 接口获取登录历史记录
+            String historyUrl = "http://172.16.120.165:13200/offline-api/system/online/history?page=" + page + "&size=" + size + "&userid=" + userid;
+//            String historyUrl = "https://gateway.usky.cn/prod-api/system/online/history?page=" + page + "&size=" + size + "&userid=" + userid;
+            // 这里需要使用HTTP客户端来调用历史接口,例如使用RestTemplate
+            RestTemplate restTemplate = new RestTemplate();
+            ResponseEntity<String> response = restTemplate.getForEntity(historyUrl, String.class);
+
+            if (response.getStatusCode().is2xxSuccessful()) {
+                // 解析响应数据
+                JSONObject historyData = new JSONObject(response.getBody());
+                JSONArray rows = historyData.getJSONObject("data").getJSONArray("rows");
+                List<String> tokenIds = new ArrayList<>();
+                for (int i = 0; i < rows.length(); i++) { // 使用 rows.length() 获取长度
+                    JSONObject row = rows.getJSONObject(i);
+                    String tokenId = row.getString("tokenId");
+                    tokenIds.add(tokenId);
                 }
 
-                String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
-                boolean deleted = redisService.deleteObject(key);
-                if (deleted) {
-                    logger.info("User with tokenId {} has been forcibly logged out.", tokenId);
-                } else {
-                    logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
+                // 执行强退操作
+                for (String tokenId : tokenIds) {
+                    String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
+                    boolean deleted = redisService.deleteObject(key);
+                    if (deleted) {
+                        logger.info("tokenId为 {} 的用户已被强制注销.", tokenId);
+                    } else {
+                        logger.warn("未能找到并删除tokenId为 {} 的用户会话", tokenId);
+                    }
                 }
-            } catch (Exception ex) {
-                logger.error("Error processing forceLogout for tokenId {}", tokenId, ex);
-                return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
+                return ApiResult.success("已强制注销所有选中token.");
+            } else {
+                logger.error("调用 /history 接口失败,状态码:{}", response.getStatusCode());
+                return ApiResult.error("SYS-0003", "调用历史记录接口失败", response.getStatusCode().toString());
             }
+        } catch (Exception ex) {
+            logger.error("处理forceLogoutMany时出错", ex);
+            return ApiResult.error("SYS-0003", "强制注销时出现内部系统错误", ex.getMessage());
         }
-        return ApiResult.success("All selected tokens have been processed for force logout.");
     }
 }