HttpSessionListener - GC 注意事项?

HttpSessionListener - GC considerations?

Tomcat 没有用于访问活动会话集合的 API,因此我想为我的 WebApp 设计一个 HttpSessionListener,但我对实现有一些顾虑。

如果我的监听器有一个成员变量列表,它存储对会话本身的引用并在 sessionDestroyed 上删除它们 - 这是否有内存泄漏的风险,就好像该列表与 [=18 不同步一样=] 对会话的内部跟踪,它们将无法被 GC 处理?

出于某种原因,这似乎是个坏主意,我想知道为什么 Tomcat 不允许访问它的内部列表?这将非常有用。任何见解将不胜感激。

我发现只要实现sessionCreated和sessionDestroyed就完全靠谱。唯一的缺点是您将失去活动会话 Tomcat 知道您的应用程序是否未 运行 或何时重新启动,但我从未见过它错过创建或销毁通知。

确保将会话数据存储在处理并发的对象中,例如 ConcurrentHashMap。

这是一个简单的例子:

public class SessionData implements HttpSessionListener {
    private final static Map<String, HttpSession> activeSessions = new ConcurrentHashMap<>();

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        if (session != null) {
            String id = session.getId();
            System.out.println("HTTP session created. ID: " + id);
            activeSessions.put(id, session);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        if (session != null) {
            String id = session.getId();
            System.out.println("HTTP session destroyed. ID: " + id);
            activeSessions.remove(id);
        }
    }
}