Это не правильно.FacesContext
недоступно в ServletRequestListener
как таковом.getCurrentInstance()
может возвращать null
, что приводит к NPE.
Если вы запускаете веб-приложение на веб-сервере HTTP (и, следовательно, не на каком-либо веб-сервере с портлетами, например), вы можете просто привести ServletRequest
на HttpServletRequest
.
public void requestInitialized(ServletRequestEvent event) {
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
// ...
}
Обратите внимание, что более распространенной практикой является использование Filter
для этого, поскольку вы можете сопоставить это с шаблоном фиксированного URL-адреса, например *.jsf
или даже на определенных сервлетах, чтобы он работал только при запуске FacesServlet
.Например, вы можете пропустить проверку файлов cookie для статических ресурсов, таких как CSS / JS / images.
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
// ...
chain.doFilter(req, res);
}
Когда вы уже находитесь в контексте JSF (в управляемом компоненте, phaselistener или чем-то еще)), вы можете просто использовать ExternalContext#getRequestCookieMap()
для получения файлов cookie.
Map<String, Object> cookies = externalContext.getRequestCookieMap();
// ...
При запуске JSF поверх Servlet API значение карты имеет тип javax.servlet.http.Cookie
.
Cookie cookie = (Cookie) cookies.get("name");