从ServletRequest获取Cookies

4

我正在使用 ServletRequestListener 来侦听新请求,获取 ServletRequest 对象并从中提取 cookie。

我注意到只有 HTTPServletRequest 有 cookies,但我没有找到这两个对象之间的联系。

请问是否可以使用

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

RequestInitialized方法中检索请求?(我希望在每个请求上运行)
提示:这全部都是在JSF 1.2应用程序中完成的。
2个回答

5
这不正确。在ServletRequestListener中,FacesContext本身不可用。 getCurrentInstance()可能会返回null,导致NPE。

如果您正在HTTP Web服务器上运行Web应用程序(因此不是某些Portlet Web服务器),则可以将ServletRequest强制转换为HttpServletRequest

public void requestInitialized(ServletRequestEvent event) {
    HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
    // ...
}

注意,更常见的做法是使用过滤器来处理此类问题,因为您可以将其映射到固定的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");

0

是的,你可以这样做。在Web场景中,这总是没问题的。如果你想确保,你可以先检查类型。(无论如何都是好习惯):

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

顺便问一下:为什么你必须使用FacesContext?你是从哪里调用这段代码的?

我不必这样做。还有其他方法吗?我使用它是因为我在一个JSF应用程序中。 - Ben
抱歉,我想我忽略了那部分。你的意思是 javax.faces.application.Application 中的应用程序吗?如果是这样,你没有选择。 - nfechner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接