如何获取Web应用程序中所有HttpSession对象的列表?
假设我有一个正在运行的基于Java的Web应用程序,其中包含0个或更多HttpSession
与之关联的有效对象。我想要一种访问当前有效HttpSession
对象列表的方法。我当时想我可以实现一个,HttpSessionListener
并使用它来将其附加到存储在应用程序作用域属性中的会话ID值列表中,但是随着会话无效,谁知道什么,我就可以更新该列表其他。
在开始烘焙自己的解决方案之前,我想我应该问一个问题:
我使用Tomcat 6.x作为我的Web应用程序容器,以及MyFaces 1.2.x(JSF)库。
我按SessionData
类进行修改以实现HttpSessionBindingListener
。当发生绑定事件时,对象将在所有SessionData
对象集中添加或删除自身。
@Overridepublic void valueBound(HttpSessionBindingEvent event) {
// Get my custom application-scoped attribute
ApplicationData applicationData = getApplicationData();
// Get the set of all SessionData objects and add myself to it
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (!activeSessions.contains(this)) {
activeSessions.add(this);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ApplicationData applicationData = getApplicationData();
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (activeSessions.contains(this)) {
activeSessions.remove(this);
}
}
继续困扰我的是,重新启动Tomcat时会发生什么。除非已将Tomcat正确配置为不将会话序列化到磁盘,否则它将这样做。当Tomcat重新启动时,HttpSession
对象(及其SessionData
对象)将反序列化,并使会话再次有效。但是,序列化/反序列化完全避开了HttpSession
侦听器事件,因此SessionData
在重新启动后,我没有机会将反序列化的引用放回到我的托管对象集中。
我对客户组织中的Tomcat的生产配置没有任何控制权,因此我无法假设它将按我期望的方式完成。
我的解决方法是将HttpSession
接收请求时的创建时间与应用程序启动时间进行比较。如果会话是在应用程序启动时间之前创建的,那么我会打电话invalidate()
给用户,并向用户发送错误/警告页面,其中包含发生的情况的说明。
我通过实现a
ServletContextListener
并将当前时间存储在contextInitialized()
侦听器方法中的应用程序范围内的对象中,来获取应用程序启动时间。
回答:
不,Servlet API没有提供一种方法。您确实必须借助a来掌握它们HttpSessionListener
。
以上是 如何获取Web应用程序中所有HttpSession对象的列表? 的全部内容, 来源链接: utcz.com/qa/406124.html