如何获取Web应用程序中所有HttpSession对象的列表?

假设我有一个正在运行的基于Java的Web应用程序,其中包含0个或更多HttpSession与之关联的有效对象。我想要一种访问当前有效HttpSession对象列表的方法。我当时想我可以实现一个,HttpSessionListener并使用它来将其附加到存储在应用程序作用域属性中的会话ID值列表中,但是随着会话无效,谁知道什么,我就可以更新该列表其他。

在开始烘焙自己的解决方案之前,我想我应该问一个问题:

我使用Tomcat 6.x作为我的Web应用程序容器,以及MyFaces 1.2.x(JSF)库。

我按SessionData类进行修改以实现HttpSessionBindingListener。当发生绑定事件时,对象将在所有SessionData对象集中添加或删除自身。

@Override

public 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

回到顶部