4

在我的应用程序中,我有一个 WebFilter。这个 Webfilter 应该检查一个 cookie。但是使用 FacesContext.getCurrentInstance() 会产生 Nullpointer 异常。我该如何解决这个问题?

网络过滤器:

@Inject
private CookieManager cm;   

[...]

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if(cm.isDoCheck()){
        cm.doCheck();
    }
    chain.doFilter(request, response);
}
[...]

执行 FacesContext.getCurrentInstance() 的 CookieManager:

[...]
private void doCheck(){
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> cookies = context.getExternalContext().getRequestCookieMap();

    Cookie cookie = (Cookie) cookies.get("frontend");
    if(cookie != null){
        setSessionHash(cookie.getValue());
    }
}
[...]

context.getExternalContext().getRequestCookieMap();给出了

StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
4

1 回答 1

5

FacesContextFacesServlet. _ 在任何 servlet之前调用任何 servlet 过滤器。因此FacesContext,每个定义在任何 servlet 过滤器中都不可用。

至于获取请求 cookie 的具体功能需求,您似乎也完全忽略了一个事实,即and的FacesContext一个门面。所有委托的方法都隐藏在/方法中(例如,在其javadoc中明确提到了这一点)。您需要的 cookie 方法很容易通过方法的参数获得。ServletRequestServletResponseExternalContextServletRequestServletResponsegetRequestCookieMap()ServletRequestdoFilter()

HttpServletRequest hsr = (HttpServletRequest) request;
Cookie[] cookies = hsr.getCookies();
// Loop over cookies to find the one matching the name.

应该注意的是,可以根据和变量在过滤器中创建一个黑客/解决方法,但是如果这些变量本身中的信息很容易获得,这毕竟没有完全意义。FacesContextServletRequestServletResponse

我建议暂停 JSF 并学习基本的 Servlet API。这基本上就是 JSF 在幕后使用的(你看,它FacesServlet“只是”一个 servlet)。阅读 javadoc 中的方法描述ExternalContext还应该提示您在基本 Servlet API 中所有这些方法的确切位置是从哪里获取信息的。

于 2013-08-16T11:04:29.657 回答