這是不正確的。 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");
我不需要。有另一種方法嗎?我正在使用它,因爲我在JSF應用程序中。 – Ben 2011-03-24 10:26:46
對不起,我想,我忽略了那部分。你的意思是Application在'javax.faces.application.Application'中嗎?在這種情況下,你沒有選擇。 – nfechner 2011-03-24 10:33:05