从ServletRequest获取Cookie

时间:2011-03-24 10:06:15

标签: java jsf servlets cookies servlet-listeners

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

我注意到只有HTTPServletRequest有Cookie,但我没有在这两个对象之间找到连接。

可以使用

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

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

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

2 个答案:

答案 0 :(得分:5)

这不正确。 FacesContext本身不具备getCurrentInstance()null可能会返回ServletRequest,导致NPE。

如果您在HTTP网络服务器上运行webapp(例如,而不是某些Portlet网络服务器),您可以将HttpServletRequest转换为public void requestInitialized(ServletRequestEvent event) { HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); // ... }

*.jsf

请注意,更常见的做法是使用ServletRequestListener,因为您可以将其映射到固定的URL模式(如FacesServlet)或甚至特定的servlet上,以便它仅在{{{ 1}}跑。例如,您可能希望跳过对CSS / JS / images等静态资源的cookie检查。

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    HttpServletRequest request = (HttpServletRequest) req;
    // ...
    chain.doFilter(req, res);
}

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

Map<String, Object> cookies = externalContext.getRequestCookieMap();
// ...

在Servlet API之上运行JSF时,地图值的类型为ExternalContext#getRequestCookieMap()

Cookie cookie = (Cookie) cookies.get("name");

答案 1 :(得分:0)

是的,你可以这样做。在Web方案中,这总是可以的。如果您想确定,可以先检查类型。 (无论如何都是好的做法):

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

顺便说一下:你为什么要使用FacesContext?你从哪里调用这段代码?