以编程方式使所有会话在 Java Web 应用程序重新启动时过期

Programmatically expire all sessions on Java web application restart

我需要一种在 tomcat 重新启动时禁用会话持久性的方法,可以将其捆绑在应用程序中。

所以我想出了以编程方式实现它的最佳方法。

问题是我找不到一种方法来简单地将 sessionid 的集合保存为应用程序范围的可序列化 bean 的 属性 并迭代它们,检索(从持久存储中恢复并反序列化)会话对象对应每个sessionid才能销毁。

相反,似乎唯一的解决方案是保留相同的集合,但保留整个会话对象。

我怎样才能避免这种情况并仍然能够在应用程序重新启动时或任何时候以独立于 servlet 容器的方式销毁所有会话对象?

这就是我最后做的事情:

我确实保留了一个带有可序列化 属性 的可序列化应用程序作用域 bean:一个 Hashtable,其键是会话 ID,值是创建时间戳(我使用了 Long 而不是时间戳以最小化内存占用)。

我正在使用 HttpSessionListener 实现来填充该哈希table 并消除其 sessionCreated 和 sessionDestroyed 方法上的过期会话。

bean 有一个 @PostConstruct 方法获取 table 并将所有值设置为 0。

下面是讨厌的部分:

每次我想使用会话对象(例如,在 request.getSession() 之后)我都必须 "manually" 调用一个方法来检查这个 table 为 0,如果会话过期并创建一个新会话。

必须有更好的方法来做到这一点,或者不应该这样做的原因。如果您知道,请告诉我。