2011-03-24 161 views
4

我使用ServletRequestListener附加到新請求,獲取ServletRequest對象並從中提取cookie。從ServletRequest獲取Cookie

我注意到只有HTTPServletRequest有cookie,但我還沒有找到這兩個對象之間的連接。

它是怎麼運用

HttpServletRequest request = ((HttpServletRequest) FacesContext.getCurrentInstance() 
       .getExternalContext().getRequest()); 

檢索請求,而在RequestInitialized方法? (我想在每次請求運行)

僅供參考 - 這是所有在JSF 1.2應用

回答

5

這是不正確的。 FacesContext不適用於ServletRequestListener本身。 getCurrentInstance()可能會返回null,導致NPE的。

如果您在HTTP Web服務器上運行Web應用程序(並且因此不是某個Portlet網絡服務器),您可以將ServletRequest轉換爲HttpServletRequest

public void requestInitialized(ServletRequestEvent event) { 
    HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); 
    // ... 
} 

需要注意的是一個比較普遍的做法是使用Filter對於這一點,因爲你可以在特定的servlet在一個固定的URL模式映射這個喜歡*.jsf,甚至使其運行FacesServlet只運行時。例如,您可能想要跳過靜態資源(如CSS/JS /圖像)上的Cookie檢查。

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { 
    HttpServletRequest request = (HttpServletRequest) req; 
    // ... 
    chain.doFilter(req, res); 
} 

當你恰好是已經JSF上下文內(在一個託管bean,PhaseListener在或其他),你可以只使用ExternalContext#getRequestCookieMap()拿到餅乾。

Map<String, Object> cookies = externalContext.getRequestCookieMap(); 
// ... 

當運行上的Servlet API之上JSF,地圖值是javax.servlet.http.Cookie類型。

Cookie cookie = (Cookie) cookies.get("name"); 
0

是做,你能做到這一點。在Web場景中,這總是可以的。如果你想確定,你可以先檢查一下這個類型。 (良好做法反正):

if (FacesContext.getCurrentInstance().getExternalContext().getRequest() instanceof HttpServletRequest) { 
... 

順便說一句:你爲​​什麼要使用FacesContext?你從哪裏調用這個代碼?

+0

我不需要。有另一種方法嗎?我正在使用它,因爲我在JSF應用程序中。 – Ben 2011-03-24 10:26:46

+0

對不起,我想,我忽略了那部分。你的意思是Application在'javax.faces.application.Application'中嗎?在這種情況下,你沒有選擇。 – nfechner 2011-03-24 10:33:05