Tomcat没有用于访问活动会话集合的API,所以我想为我的WebApp设计一个HttpSessionListener,但我对实现有一些担忧。
如果我的监听器有一个成员变量List,它存储对Sessions本身的引用并在sessionDestroyed
上删除它们 - 这是否会导致内存泄漏,就像该列表与Tomcat不同步一样内部跟踪会话,他们将无法成为GC?
出于某种原因,这似乎是一个坏主意,我想知道为什么Tomcat不能访问它的内部列表?这将非常有用。任何见解都将不胜感激。
答案 0 :(得分:1)
我发现只要你实现了sessionCreated和sessionDestroyed,它就完全可靠了。唯一的缺点是你将失去Tomcat知道你的应用程序是否运行或重启的活动会话,但我从来没有看到它错过了获取创建或销毁的通知。< / p>
确保将会话数据存储在处理并发的内容中,如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);
}
}
}