这是不正确的。 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