end*_*yha 6 java session servlets
如何以优雅的方式通过id或Web应用程序(Java 2 EE)中所有当前活动的http会话获取任何http会话?
目前我有一个WebSessionListener和一次创建会话我把它放进去ConcurrentHashMap() (map.put(sessionId, sessionObj)),一切都好,我可以随时通过会话ID从该地图检索HTTP会话,但看起来HttpSession对象永远不会完成...甚至会话无效地图仍然参考无效的会话对象...我也读过这篇文章,看起来WeakHashMap在我的情况下是不可接受的......
换句话说,我需要有可能查看任何HttpSession甚至获取当前所有活动HttpSession并从那里检索一些属性...
请告诉别人:)
我需要访问HttpSession对象,因为以下原因:
有时用户会做一些可能影响另一个并发用户工作的操作/请求,例如管理员应该禁用用户帐户但该用户当前正在使用该系统,在这种情况下我需要向管理员显示一条消息,例如"用户XXX当前使用系统"因此我需要检查是否有任何持有用户XXX凭据的HttpSession已存在且处于活动状态.所以这就是我需要这样的可能性来获得任何http会话甚至所有会话.
我当前的实现是:SessionManager知道所有会话(ConcurrentMap)和HttpSessionListener,它们将会话/删除会话放入SessionManager.
我担心可能出现的内存问题,我想与某人讨论这个问题,但目前我清楚地看到一切都应该正常工作,因为当调用sessionDestroyed()方法时,所有无效的会话都将从地图中删除...
非常感谢您的重播,但现在我明白这个问题只是想象力:)
根据您的澄清:
有时用户会做一些可能影响另一个并发用户工作的操作/请求,例如管理员应该禁用用户帐户但该用户当前正在使用该系统,在这种情况下我需要向管理员显示一条消息,例如"用户XXX当前使用系统"因此我需要检查是否有任何持有用户XXX凭据的HttpSession已存在且处于活动状态.所以这就是我需要这样的可能性来获得任何http会话甚至所有会话.
为此,您实际上不需要了解会话的任何信息.您只需要知道哪些用户已登录.为此,您可以完美地让代表登录用户的模型对象实现HttpSessionBindingListener.我当然假设你通过设置/删除User模型作为会话属性来遵循登录/注销用户的正常习惯用法.
public class User implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
logins.add(this);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
logins.remove(this);
}
// @Override equals() and hashCode() as well!
}
Run Code Online (Sandbox Code Playgroud)
然后在您的管理应用中的某个地方,只需从ServletContext以下位置获取登录信息:
Set<User> logins = (Set<User>) servletContext.getAttribute("logins");
Run Code Online (Sandbox Code Playgroud)
一般来说,您的servlet容器将拥有自己的会话管理器,它负责维护会话的生命周期,并将传入的请求与适当的会话相关联(通过cookie,锚参数,无论它想要什么策略).
执行此操作的优雅方法是以任何允许的方式挂接到此会话管理器.例如,您可以子类化默认值,以允许您访问任意会话.
但是,听起来你正在做的事情掩盖了你的架构的潜在问题.会话中包含的数据应该特定于该会话,因此通常您不需要查找任意数据以提供Web应用程序的标准逻辑.管理/内务处理任务通常由容器处理 - 所以再次,你不应该干涉这个.
如果您说明了为什么要访问任意会话,那么替代方法可能更适合您的目标.
| 归档时间: |
|
| 查看次数: |
9379 次 |
| 最近记录: |