2012-04-05 55 views
11

關於java servlet的一般問題以及處理請求的最佳方法。如果我打從遠程服務器請求我的doGet方法:Java servlet - 會話清理(HttpServletRequest)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    .... 
    <do work here> 
    .... 
    kill(request); 
} 

private void kill(HttpServletRequest request) { 
//How do I kill the user session here? 
} 

後,我處理這個請求在我結束和我產生輸出給請求者,我想基本上是「殺死」自己的會話。目前,該會話持續不斷,從而消耗內存。然後一旦達到最大值,所有其他呼叫超時。

我嘗試使用請求對象創建一個HttpSession對象,但得到了同樣的結果:

HttpSession session = request.getSession(); 
session.invalidate(); 
+1

我有你的具體問題,需要以不同的方式來解決的印象會刪除屬性。 – BalusC 2012-04-05 21:48:38

+0

可能。最終目標是在處理請求後,我想在會話池中結束會話。無論是否殺死請求對象或爲該會話創建會話對象以刪除它,我都不確定。 – user82302124 2012-04-06 13:13:11

回答

20
HttpSession session = request.getSession(false); 
if (session != null) { 
    session.invalidate(); 
} 

是走由所建議的正確方法文檔。一旦發送新的請求,將創建一個新的會話。

您提到您的會話仍佔用內存。你有任何其他對會議上的這些對象的引用?

你也可能想看看:如果你不想會話行爲即,有多個請求之間的狀態Servlet Session behavior and Session.invalidate

2

嘗試用

session = request.getSession(false); // so if no session is active no session is created 
if (session != null) 
    session.setMaxInactiveInterval(1); // so it expires immediatly 
1

。爲什麼你想要創建/使用會話。不要創建會話或不在會話中存儲任何內容。

爲確保您的代碼不使用會話,請編寫一個請求包裝器,以覆蓋getSession()方法。

5

您可以使用

session.removeAttribute("attribute name");