2010-01-04 63 views
2

我已經設置了Tomcat在閒置15分鐘後處理會話。事情是這樣的如何讓用戶知道他/她的會話已過期?

<session-config> 
    <session-timeout>15</session-timeout> 
</session-config> 

每當用戶訪問受限制的網頁(需要先登錄的用戶)我檢查會話,看是否在登錄過程已經完成。如果有,則授予訪問權限(如果沒有),那麼用戶將被重定向到登錄頁面,並在其中提示用戶輸入有效的ID和密碼。如果會話超時,則用戶需要重新登錄。這很好,但我想讓用戶知道他/她必須再次登錄,因爲會話已超時。

我該如何去做這件事?我發現HttpSessionListener接口,並認爲它可能會有所幫助,但sessionDestroyed方法在會話失效之前被調用,因此設置參數沒有什麼好處,如預期的那樣。

回答

2

登錄時,請設置一個長期存活的Cookie(1天?),在正常註銷期間刪除(將年齡設置爲0)。如果您在用戶未登錄且cookie仍然存在的情況下再次登錄登錄頁面,則表示該會話已過期。

<c:if test="${empty user && not empty cookie.user}"> 
    You were logged out because the session was expired. 
</c:if> 
2

當您將用戶重定向到登錄表單時,請設置一個請求參數,url參數或指示會話已過期的cookie(如果您使用cookie,則在顯示登錄表單後清除cookie)。然後,在顯示錶單時,檢查會話過期指示符並顯示相應的消息。

+0

當會話過期時,實際上只設置**參數/ cookie是很困難的。你會如何確定*何時做到這一點?在會話過期期間,沒有辦法使用「HttpServletRequest」。隨後的新請求/會話不知道前一個請求/會話。 – BalusC 2010-01-05 11:53:49

+0

用戶登錄時在用戶的瀏覽器中添加一個cookie,並在HttpSession中添加一個標記。如果cookie存在且會話或令牌不存在,則用戶最近登錄並且他們的會話超時。 – 2010-01-05 16:24:08

+0

是的,正如我回答的那樣。但是,您直接說*當您將用戶重定向到登錄表單*。你會怎麼做? – BalusC 2010-01-05 21:20:33

2

您可以檢查會話已過期和/或超時:

if (request.getRequestedSessionId() != null 
     && !request.isRequestedSessionIdValid()) { 
    // Session is expired 
} 

使用getRequestedSessionId到新的和現有的(有效/過期)會話進行區分,並使用isRequestedSessionIdValid區分betwheen有效的和新的/過期的會話。

您可以將此代碼置於Filter

+1

這是一個很好的發現。順便說一句,你也可以在EL中做這個。該請求可以通過'$ {pageContext.request}'訪問。 – BalusC 2010-06-29 12:12:11

+0

謝謝,這是一個非常好的方法 – pgmura 2010-06-29 15:40:42

相關問題