当前位置: 首页 > 面试题库 >

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

农明辉
2023-03-14
问题内容

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

在开始烘焙自己的解决方案之前,我想我应该问一个问题:
Servlet API是否提供某种方法来访问未失效会话对象的完整列表?

我使用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



 类似资料:
  • 问题内容: 如果我有一个水果列表,其中包含各种实现,如,等。该列表是必需的,因为其他方法会对列表中的所有水果执行常规操作。 如何将特定类型的所有对象从列表中删除?例如所有的苹果?进行instanceof / if-else检查非常难看,尤其是在有许多不同的类时。 如何改善以下内容? 问题答案: 您应该知道-实例是不好的代码实践。 编写.getType()(返回的对象的枚举类型)怎么办?

  • 问题内容: 我变得好,老又怕,而且在这种情况下经常发生,我在查找导致问题的代码中存在哪些细微的错误时遇到了问题。 我的问题是:有没有办法获取当前Hibernate会话中每个对象的列表? 当我得到这个问题的答案时,我可能会解决当前的问题,但是无论如何,能够列出会话中的所有内容将在下次发生时大有帮助。 问题答案: Hibernate不会向公众公开其内部信息,因此您不会在公共API中找到要搜索的内容。但

  • 问题内容: 我有许多使用CTE,临时表,表变量和子查询的存储过程,我需要获取该存储过程中使用的所有列(包括数据库,架构和表/视图)的列表。我不需要获取临时表,表变量或CTE中的列。我只需要在服务器上的数据库的表或视图中定义的引用列。 我试过了,但是在第一个选择查询后或在CTE中选择后,它们不返回列。 问题答案: 当执行存储过程时,它将被解析并编译成查询计划,将对其进行缓存,您可以通过sys.dm_

  • 问题内容: 是否有一种快速的方法可以从中的所有表获取所有列名,而不必列出所有表? 问题答案:

  • 问题内容: 我有获取POJO作为其参数的方法。现在,我想以编程方式获取POJO的所有属性(因为我的代码在运行时可能不知道POJO中的所有属性),并且还需要获取这些属性的值。最后,我将形成POJO的字符串表示形式。 我可以使用ToStringBuilder,但是我想以特定于我的要求的特定格式构建输出字符串。 有可能在Beanutils中这样做吗?如果是,是否有任何指向方法名称的指针?如果没有,我应该

  • 问题内容: 获取运行Java应用程序时使用的所有类的列表的最简单方法是什么? 假设通过运行来调用: 运行该程序后,我想列出运行该程序时使用过的所有类: 在这种情况下,如果某个类已在程序执行期间由类加载器加载,并且如果存在此类静态块,则该类的静态块将被运行,则将该类定义为正在使用。 问题答案: 使用标志 verbose:class* 运行Java * 要将其附加到文件中: 等等 它还列出了定义这些文