这是不正确的。本身FacesContext
不可用。ServletRequestListener
可能会getCurrentInstance()
返回null
,导致 NPE。
如果您在 HTTP 网络服务器上运行 Web 应用程序(例如,不是某些 Portlet 网络服务器),您可以ServletRequest
将HttpServletRequest
.
public void requestInitialized(ServletRequestEvent event) {
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
// ...
}
请注意,更常见的做法是为此使用 a Filter
,因为您可以将其映射到固定的 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");