2009-06-04 61 views
6

如何從SessionListener訪問請求標頭?如何在HttpSessionListener中獲取HttpServletRequest?

我需要在創建時在當前會話上設置超時。超時需要根據HttpServletRequest中的頭部而有所不同。我已經有了一個SessionListener(實現HttpSessionListener)來記錄新會話的創建和銷燬,而且它似乎是設置超時的最合理的地方。

我試過以下,但它總是將ctx設置爲null。

FacesContext ctx = FacesContext.getCurrentInstance(); 

回答

8

HttpSessionListener無權訪問該請求,因爲在未請求任何請求時調用該請求—以通知會話銷燬。

因此,一個FilterServlet將是更好的地方來檢查請求並指定會話超時。

1

您不能(請參閱the API)。請求允許您訪問會話,但不能以其他方式訪問。

您甚至可能對同一個會話有併發請求,所以這是不可行的。

+3

「您甚至可能會對同一個會話發出併發請求,所以這不可行。」我不同意!只有一個請求會導致會話被創建爲「sessionCreated」被觸發。這是規範中的一個疏忽......對於「sessionCreated」方法,您應該能夠找出哪個請求創建了會話! – 2013-08-13 10:00:57

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

JSF上下文是按請求和線程本地的。因此,此方法調用可能會在JSF控制器調用之外返回null(例如FacesServlet.service) - 所以,其他線程和任何不通過Faces servlet映射的請求都會返回。

這在技術上是可以設置此超時使用JSF的機制 - 你可以使用一個phase listenerRENDER RESPONSE後檢查會話,但你仍然要cast to the servlet API設置超時。相位偵聽器的優點是可以在faces-config(see spec)或for specific views中進行全局註冊。在JAR中定義的全局階段監聽器可以放置到多個WAR中,以便您輕鬆地重用該功能。

(您也override how the session is provisioned to JSF可以,但工作量過多。)

對於一次性的,一個Filtererickson's suggestion是真的簡單。

相關問題