这不正确。在
ServletRequestListener
中,
FacesContext
本身不可用。
getCurrentInstance()
可能会返回
null
,导致NPE。
如果您正在HTTP Web服务器上运行Web应用程序(因此不是某些Portlet Web服务器),则可以将ServletRequest
强制转换为HttpServletRequest
。
public void requestInitialized(ServletRequestEvent event) {
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
}
注意,更常见的做法是使用
过滤器
来处理此类问题,因为您可以将其映射到固定的URL模式,例如
*.jsf
甚至特定的Servlet上,以便仅在
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()
来获取cookie。
Map<String, Object> cookies = externalContext.getRequestCookieMap()
// ...
当在Servlet API上运行JSF时,映射值的类型为
javax.servlet.http.Cookie
。
Cookie cookie = (Cookie) cookies.get("name")
javax.faces.application.Application
中的应用程序吗?如果是这样,你没有选择。 - nfechner