From 452cf744b08f2148729427fec50b07a4cf0cad31 Mon Sep 17 00:00:00 2001
From: sgj <1442489573@qq.com>
Date: 星期一, 23 三月 2026 15:18:15 +0800
Subject: [PATCH] 在线用户菜单页排序修复
---
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java | 99 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 88 insertions(+), 11 deletions(-)
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java
index 393a54a..4869c79 100644
--- a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java
@@ -5,12 +5,15 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysUserOnline;
+import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.cache.Cache;
@@ -21,7 +24,10 @@
import org.crazycake.shiro.RedisSessionDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
import java.io.Serializable;
import java.util.*;
@@ -31,9 +37,11 @@
*
* @author ruoyi
*/
+@Slf4j
@Controller
@RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController {
+
private String prefix = "monitor/online";
@Autowired
@@ -55,8 +63,15 @@
Collection<Session> sessions = redisSessionDAO.getActiveSessions();
Iterator<Session> it = sessions.iterator();
List<SysUserOnline> sessionList = new ArrayList<SysUserOnline>();
+ long currentTime = System.currentTimeMillis();
while (it.hasNext()) {
- SysUserOnline user = getSession(it.next());
+ Session session = it.next();
+ // 妫�鏌� Session 鏄惁杩囨湡
+ if (isSessionExpired(session, currentTime)) {
+ continue;
+ }
+
+ SysUserOnline user = getSession(session);
if (StringUtils.isNotNull(user)) {
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(loginName)) {
if (StringUtils.equals(ipaddr, user.getIpaddr())
@@ -76,28 +91,90 @@
}
}
}
+ // 瀵� sessionList 鏍规嵁 lastAccessTime 杩涜 desc 鎺掑簭
+ sessionList.sort((a, b) -> {
+ if (a.getLastAccessTime() == null) {
+ return 1;
+ }
+ if (b.getLastAccessTime() == null) {
+ return -1;
+ }
+ return b.getLastAccessTime().compareTo(a.getLastAccessTime());
+ });
+ // 瀵� sessionList 杩涜鍒嗛〉
+ PageDomain pageDomain = TableSupport.buildPageRequest();
+ Integer pageNum = pageDomain.getPageNum();
+ Integer pageSize = pageDomain.getPageSize();
+ int total = sessionList.size();
+ int fromIndex = (pageNum - 1) * pageSize;
+ int toIndex = Math.min(fromIndex + pageSize, total);
+
+ if (fromIndex < total) {
+ sessionList = sessionList.subList(fromIndex, toIndex);
+ } else {
+ sessionList = new ArrayList<>();
+ }
rspData.setRows(sessionList);
- rspData.setTotal(sessionList.size());
+ rspData.setTotal(total);
+ //杩斿洖鍒嗛〉鍚庢暟鎹�
return rspData;
}
+
+ /**
+ * 妫�鏌� Session 鏄惁宸茶繃鏈�
+ */
+ private boolean isSessionExpired(Session session, long currentTime) {
+ if (session == null) {
+ return true;
+ }
+
+ Long timeout = session.getTimeout();
+ if (timeout == null || timeout <= 0) {
+ timeout = 1800000L; // 榛樿 30 鍒嗛挓
+ }
+
+ long lastAccessTime = session.getLastAccessTime().getTime();
+ return (currentTime - lastAccessTime) > timeout;
+ }
+
@RequiresPermissions(value = {"monitor:online:batchForceLogout", "monitor:online:forceLogout"}, logical = Logical.OR)
@Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE)
@PostMapping("/batchForceLogout")
@ResponseBody
- public AjaxResult batchForceLogout(@RequestBody List<SysUserOnline> sysUserOnlines) {
- for (SysUserOnline userOnline : sysUserOnlines) {
- String sessionId = userOnline.getSessionId();
- String loginName = userOnline.getLoginName();
- if (sessionId.equals(ShiroUtils.getSessionId())) {
- return error("褰撳墠鐧诲綍鐢ㄦ埛鏃犳硶寮洪��");
+ public AjaxResult batchForceLogout(String ids) {
+ if (StringUtils.isBlank(ids)) {
+ return error("鍙傛暟涓嶈兘涓虹┖");
+ }
+
+ String[] sessionIds = ids.split(",");
+ for (String sessionId : sessionIds) {
+ try {
+ Session session = redisSessionDAO.readSession(sessionId);
+ if (session != null) {
+ if (sessionId.equals(ShiroUtils.getSessionId())) {
+ return error("褰撳墠鐧诲綍鐢ㄦ埛鏃犳硶寮洪��");
+ }
+ redisSessionDAO.delete(session);
+
+ Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
+ if (obj instanceof SimplePrincipalCollection) {
+ SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
+ Object principal = spc.getPrimaryPrincipal();
+ if (principal instanceof SysUser) {
+ SysUser sysUser = (SysUser) principal;
+ removeUserCache(sysUser.getLoginName(), sessionId);
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("寮洪��鐢ㄦ埛澶辫触锛宻essionId: {}", sessionId, e);
}
- redisSessionDAO.delete(redisSessionDAO.readSession(sessionId));
- removeUserCache(loginName, sessionId);
}
return success();
}
+
private SysUserOnline getSession(Session session) {
Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
if (null == obj) {
--
Gitblit v1.9.3