如何优雅地通过id获取任何http会话或获取Web应用程序中所有当前活动的http会话(Java 2 EE)?
目前,我有一个WebSessionListener,一旦会话被创建,我就将其放入ConcurrentHashMap()(map.put(sessionId,sessionObj)),一切都很好,我可以随时通过会话ID从该映射中检索HTTP会话,但似乎HttpSession对象永远不会完成...即使会话无效,映射仍然引用无效的会话对象...我还阅读了这篇文章,看起来WeakHashMap在我的情况下是不可接受的...
换句话说,我需要查看任何HttpSession的可能性,甚至获取所有当前活动的HttpSession并从中检索一些属性...
请建议 :)
更新
我需要访问HttpSession对象,因为以下原因:
有时用户会执行一些操作/请求,可能会影响另一个并发用户的工作,例如管理员应该禁用用户帐户,但是此用户正在使用系统,这种情况下我需要向管理员显示一条消息,例如“用户XXX当前正在使用系统”,因此我需要检查是否存在任何持有用户XXX凭据的HttpSession已存在且处于活动状态。因此,我需要这样的可能性来获取任何http会话或甚至所有会话。
我的当前实现是:SessionManager知道所有会话(ConcurrentMap),HttpSessionListener将会话放入/删除会话到SessionManager中。
我担心可能会出现的内存问题,并希望与某人讨论此问题,但目前我清楚地看到一切都应该正常工作,因为当sessionDestroyed()方法被调用时,所有无效的会话将从映射中删除...
非常感谢您的回复,但现在我明白问题只是想象 :)
目前,我有一个WebSessionListener,一旦会话被创建,我就将其放入ConcurrentHashMap()(map.put(sessionId,sessionObj)),一切都很好,我可以随时通过会话ID从该映射中检索HTTP会话,但似乎HttpSession对象永远不会完成...即使会话无效,映射仍然引用无效的会话对象...我还阅读了这篇文章,看起来WeakHashMap在我的情况下是不可接受的...
换句话说,我需要查看任何HttpSession的可能性,甚至获取所有当前活动的HttpSession并从中检索一些属性...
请建议 :)
更新
我需要访问HttpSession对象,因为以下原因:
有时用户会执行一些操作/请求,可能会影响另一个并发用户的工作,例如管理员应该禁用用户帐户,但是此用户正在使用系统,这种情况下我需要向管理员显示一条消息,例如“用户XXX当前正在使用系统”,因此我需要检查是否存在任何持有用户XXX凭据的HttpSession已存在且处于活动状态。因此,我需要这样的可能性来获取任何http会话或甚至所有会话。
我的当前实现是:SessionManager知道所有会话(ConcurrentMap),HttpSessionListener将会话放入/删除会话到SessionManager中。
我担心可能会出现的内存问题,并希望与某人讨论此问题,但目前我清楚地看到一切都应该正常工作,因为当sessionDestroyed()方法被调用时,所有无效的会话将从映射中删除...
非常感谢您的回复,但现在我明白问题只是想象 :)
Set<User> logins = new HashSet<>(); if((Set<User>) session.getServletContext().getAttribute("logins") != null){ logins = (Set<User>) session.getServletContext().getAttribute("logins"); } logins.add(loginUser); ServletContext context = getServletContext(); context.setAttribute("logins", logins);
这是正确的方法吗? - yaylitzis