2012-06-26 27 views
4

在我的應用程序有一個退出按鈕,在單擊其中的當前用戶的會話由下面這段代碼的無效..如何檢測會話已在JSF 2中失效?

FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 

我將用戶重定向到不同的頁面。

但現在我想如果用戶點擊後退按鈕,我會把他帶到應用程序的開始頁面,而不是他最後一頁瀏覽的頁面。 我有一個應用程序階段監聽器,它將頁面緩存相關的標頭設置爲'none',現在我只想檢測那個用戶會話已經失效。 但我猜想無論何時用戶點擊後退按鈕,它都會爲用戶創建一個新的會話。有什麼辦法可以預防它嗎?

回答

11

如何檢測會話已在JSF 2中失效?

檢查用戶是否具有requested a session IDis not valid

HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); 

if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) { 
    // Session has been invalidated during the previous request. 
} 

它爲用戶創建一個新的會話。有什麼辦法可以預防它嗎?

不要讓你的應用代碼創建會話即可。會話將隱式地在應用程序需要在會話中存儲某些內容時創建,例如視圖或會話範圍的Bean,或者<h:form>的視圖狀態等


我有一個應用程序階段監聽器設置頁面緩存相關的頭爲「無」

一個servlet過濾器是一個更好的地方。另請參見Avoid back button on JSF web application

+0

非常感謝,但只有一個問題,您爲什麼比階段偵聽器更喜歡過濾器來設置響應頭? – user1220373

+0

因爲它更容易。完全不需要JSF上下文。此外,鏈接答案中的示例關心JSF資源,您確實不希望爲它們禁用緩存。 – BalusC