从ServletRequest获取Cookie

Ben*_*Ben 4 java cookies jsf servlets servlet-listeners

我正在使用ServletRequestListener附加新请求,获取ServletRequest对象并从中提取cookie.

我注意到只有HTTPServletRequestcookie但我没有找到这两个对象之间的连接.

可以使用吗?

HttpServletRequest request = ((HttpServletRequest) FacesContext.getCurrentInstance()
                .getExternalContext().getRequest());
Run Code Online (Sandbox Code Playgroud)

RequestInitialized方法中检索请求?(我确实希望在每个请求上运行)

仅供参考 - 这一切都在JSF 1.2应用程序中完成

Bal*_*usC 5

这是不正确的.该FacesContext不是一个可用的ServletRequestListener本身.将getCurrentInstance()可能会返回null,导致NPE的.

如果您在HTTP Web服务器上运行webapp(例如,而不是某些Portlet Web服务器),您可以将其转换ServletRequestHttpServletRequest.

public void requestInitialized(ServletRequestEvent event) {
    HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,更常见的做法是使用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);
}
Run Code Online (Sandbox Code Playgroud)

当您恰好已经在JSF上下文中(在托管bean,phaselistener或其他任何内容中)时,您可以使用它ExternalContext#getRequestCookieMap()来获取cookie.

Map<String, Object> cookies = externalContext.getRequestCookieMap();
// ...
Run Code Online (Sandbox Code Playgroud)

在Servlet API之上运行JSF时,映射值是类型javax.servlet.http.Cookie.

Cookie cookie = (Cookie) cookies.get("name");
Run Code Online (Sandbox Code Playgroud)