Java HttpSessionListener-GC注意事项?

Java HttpSessionListener-GC注意事项?,java,tomcat,Java,Tomcat,Tomcat没有用于访问活动会话集合的API,因此我想为我的WebApp设计一个HttpSessionListener,但我对实现有一些顾虑 如果我的侦听器有一个成员变量列表,该列表存储对会话本身的引用,并在sessionDestroyed上删除它们-这是否有内存泄漏的风险,就像该列表与Tomcat对会话的内部跟踪不同步一样,它们将无法进行GCed 出于某种原因,这似乎是个坏主意,我想知道为什么Tomcat不允许访问它的内部列表?这将非常有用。如果您有任何见解,我们将不胜感激。我发现,只要您实现

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

如果我的侦听器有一个成员变量列表,该列表存储对会话本身的引用,并在
sessionDestroyed
上删除它们-这是否有内存泄漏的风险,就像该列表与Tomcat对会话的内部跟踪不同步一样,它们将无法进行GCed


出于某种原因,这似乎是个坏主意,我想知道为什么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);
        }
    }
}
公共类SessionData实现HttpSessionListener{
private final static Map activeSessions=new ConcurrentHashMap();
@凌驾
已创建公共无效会话(HttpSessionEvent se){
HttpSession session=se.getSession();
if(会话!=null){
String id=session.getId();
System.out.println(“HTTP会话已创建。ID:+ID”);
activeSessions.put(id,session);
}
}
@凌驾
public void sessionDestroyed(HttpSessionEvent se){
HttpSession session=se.getSession();
if(会话!=null){
String id=session.getId();
System.out.println(“HTTP会话已销毁。ID:+ID”);
activeSessions.remove(id);
}
}
}

这将非常有用。您想用它做什么?例如,我可以立即确定有多少活动会话使用相同(以及哪些)用户令牌,我们的应用程序将哪些令牌存储在会话属性中