2015-01-27 95 views
2

Tomcat沒有訪問活動會話集合的API,所以我想爲我的WebApp設計一個HttpSessionListener,但是我有一些關於實現的問題。HttpSessionListener - GC注意事項?

如果我的監聽器有一個成員變量列表,它存儲對會話本身的引用並在sessionDestroyed上刪除它們 - 這是否會冒內存泄漏,就好像該列表與Tomcat內部跟蹤Sessions不同步,不能被GCed?

出於某種原因,這似乎是一個壞主意,我想知道爲什麼Tomcat不能訪問它的內部列表?這將是非常有用的。任何見解,將不勝感激。

+0

_IT將是極其useful._那你想用它做什麼? – 2015-01-27 01:30:28

+0

好吧,例如我可以立即確定有多少活動會話正在使用相同(和哪些)用戶令牌,我們的應用程序存儲在會話屬性中 – Black 2015-01-27 12:33:54

回答

1

我發現只要實現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); 
     } 
    } 
}