Получить Cookies от ServletRequest - PullRequest
       30

Получить Cookies от ServletRequest

4 голосов
/ 24 марта 2011

Я использую ServletRequestListener, чтобы присоединиться к новым запросам, получить объект ServletRequest и извлечь из него файлы cookie.

Я заметил, что только HTTPServletRequest имеет файлы cookie, но у меня нетобнаружил связь между этими двумя объектами.

Можно ли использовать

HttpServletRequest request = ((HttpServletRequest) FacesContext.getCurrentInstance()
                .getExternalContext().getRequest());

для получения запроса в методе RequestInitialized?(Я хочу запускать каждый запрос)

К вашему сведению - все это делается в приложении JSF 1.2

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Это не правильно.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");
0 голосов
/ 24 марта 2011

Да, вы можете сделать это.В веб-сценариях это всегда будет хорошо.Если вы хотите быть уверены, вы можете сначала проверить тип.(Хорошая практика в любом случае):

if (FacesContext.getCurrentInstance().getExternalContext().getRequest() instanceof HttpServletRequest) {
...

Кстати: почему вы должны использовать FacesContext?Откуда ты звонишь по этому коду?

...