4

ServletRequestListener用来附加到新请求、获取ServletRequest对象并从中提取 cookie。

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

可以用吗

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

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

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

4

2 回答 2

5

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

如果您在 HTTP 网络服务器上运行 Web 应用程序(例如,不是某些 Portlet 网络服务器),您可以ServletRequestHttpServletRequest.

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

请注意,更常见的做法是为此使用 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);
}

当您碰巧已经在 J​​SF 上下文中(在托管 bean、phaselistener 或其他任何东西中)时,您可以只使用ExternalContext#getRequestCookieMap()来获取 cookie。

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

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

Cookie cookie = (Cookie) cookies.get("name");
于 2011-03-24T12:51:43.483 回答
0

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

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

顺便说一句:你为​​什么要使用FacesContext?您从哪里调用此代码?

于 2011-03-24T10:18:21.733 回答