2011-06-01 58 views

回答

0
  • 計劃從ServletContextListener
  • 使用remove()HashMap方法的工作簡單地說,要確保有關concurrency
0

最簡單的方法是實施ServletContextListener,在contextInitialized()啓動一個線程,將做的工作。在contextDestroyed扼殺了線程。該映射應該是線程安全的:同步的或併發的。

+0

我可以有示例代碼嗎? – dean 2011-06-01 11:05:19

+0

爲什麼一個計時器,容器可以在會話空閒時給你一個回調。 – 2011-06-01 11:15:36

+0

你說得對,我錯過了解釋這個問題。定時器根本不需要。 – 2011-06-01 11:32:37

2

可能您可以將應用程序的會話超時設置爲20分鐘,並確保每個用戶都有一個活動會話,其中也包含用戶標識。如果用戶閒置20分鐘,則會話將被破壞。

然後,您可以編寫一個HttpSessionListener在會話被銷燬時被調用。從那裏你可以得到用戶ID(你之前已經存儲過,可能在用戶登錄時),並且可以從SessionContext中的HashMap中刪除它。

1

使用servlet會話管理使會話失效。如果閒置20分鐘,web.xml中的這個片段將會使會話無效。

<session-config><session-timeout>20</session-timeout></session-config> 

實現javax.servlet.http.HttpSessionListener.sessionCreated()創建一個會話時得到一個回調。這個會話ID添加到使用

List<String> users = HttpSessionEvent.getSession().getServletContext().getAttribute("users"); 
users.add(session.getId()); 

實現javax.servlet.http.HttpSessionListener.sessionDestroyed(),它得到當會話被銷燬回調servlet上下文。從服務器上下文中刪除此會話使用

List<String> users = HttpSessionEvent.getSession().getServletContext().getAttribute("users"); 
users.remove(session.getId()); 
+0

這對於會話很好,但在我看來這不適用於servlet上下文 – dean 2011-06-01 11:09:35

+0

對不起,什麼不適用於servlet上下文。你能否詳細說明。 – 2011-06-01 11:12:43