2013-12-10 52 views
1

要求如下:當用戶會話過期時,調用expired.htm頁面,但在與網站的第一個連接上顯示login.htm。如何檢測過期會話與沒有會話

我嘗試使用過濾器,但它不起作用,我無法告訴過濾器如何理解它是新請求還是舊請求已過期。這是我使用的代碼:

if (session.getAttribute("userProfile") == null) { 

    logger.debug("Session: " + (session.isNew() ? "true" : "false")); 
    logger.debug(request.getSession().isNew()); 

    if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) { 
     return new ModelAndView("redirect:expired.htm"); 
    } else { 
     return new ModelAndView("redirect:login.htm"); 
    } 


} 

我想在這裏提出了堆棧溢出和一般的互聯網上不同的解決方案,但沒有奏效,每個請求轉到expired.htm

+1

我想說的是,如果用戶發送無效的會話ID會話可以被認爲是過期的,也就是說,爲了獲得用戶將必須已經訪問過該站點的ID或者已經複製了具有會話ID的鏈接。 – Thomas

+0

我也檢查了isNew,但它總是如此,當會話過期時(我激活一個監聽器,當會話過期時顯示我) –

回答

0

如何獲得會話對象?在此之前,請使用

if (request.getSession(false)==null) { 
    // no session present (expired or new visitor) 
    [... do something ...] 
} else { 
    // active session present 
} 
0

您需要在使用會話中的任何屬性之前使用上述驗證。因爲如果會話不存在,您無法獲得它的屬性。 你需要把虛假的內部parentesis。

if(request.getSession(false) == null) { //Session don't exists 
... 
} 

的Java解釋:

公共HttpSession中的getSession(布爾創建)

返回與此請求相關的當前的HttpSession,或者如果沒有當前會話,並創建爲true,則返回一個新的會話。
如果create爲false且請求沒有有效的HttpSession,則此方法返回null。
爲確保會話得到適當維護,您必須在提交響應之前調用此方法。如果容器使用cookie來維護會話完整性,並且在提交響應時被要求創建新會話,則會拋出IllegalStateException。
參數:
create - 如果需要,則爲true創建此請求的新會話;假返回NULL如果沒有當前會話
返回:
這個請求或空相關聯的HttpSession中,如果製作的是虛假的,該請求沒有有效的會話