2010-05-20 44 views
2

我有一個JSP/Servlet的Web應用程序是由一個以上的servlet(和一些JSP)的確保一個新的會話

的我需要創建一個新的HttpSession每當用戶訪問servlet A,知道servlet A是主頁(即他可以將它作爲應用程序中的第一個servlet /頁面訪問)。

到目前爲止好,我可以在Servlet中生成的開始寫代碼如下:

HttpSession session = request.getSession(false); 
if (session == null) { 
    logger.debug("starting new session..."); 
    session = request.getSession(); 
    // other stuff here 
} 

但問題是,如果用戶沒有關閉他的瀏覽器(即使他關閉選項卡 - 例如在Firefox中 - 會話將仍然打開),所以當他嘗試再次打開我的網站時,最後一個會話將被重新使用(當然在會話超時範圍內),而且我不會需要。每當他訪問Servlet A時,我都需要他得到一個全新的HttpSession。

但不幸的是,他可能會根據某些場景每次訪問此servlet兩次!

回答

2

在我看來,你不應該使用會話用於此目的。也許你可以添加一個參數來請求(即事務ID),並通過所有相關的請求傳遞它,所以當用戶關閉頁面時,事務ID將消失。然後,您可以將與給定交易ID相關聯的任何數據存儲在http會話或其他地方,也可以在一段時間後清除它。

Spring框架有一個名爲bean範圍的抽象,它看起來非常適合您的場景,因此您可以爲您的事務(或用戶會話)創建一個自定義範圍,並將所有數據存儲在某些具有此類範圍的bean中自定義範圍。

1

您應該在使用過的會話中存儲一些信息(屬性)。如果它一直以來,invalidate

HttpSession session = request.getSession(); 

Object isOld = session.getAttribute("isOld"); 

if (isOld != null) 
{ 
    session.invalidate(); 

    // Recreate session 
    session = request.getSession(); 
} 

session.setAttribute("isOld", new Object());