在我的应用程序中,我有一个WebFilter。这个网络过滤器应该检查一个coockie。但是FacesContext.getCurrentInstance()的使用提供了一个Null指针异常。我怎么才能解决这个问题?
WebFilter:
@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);
}
[...]CookieManager,它执行FacesContext.getCurrentInstance():
[...]
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发布于 2013-08-16 11:04:29
FacesContext是由FacesServlet创建的。在任何servlet之前调用任何servlet过滤器。因此,FacesContext在任何servlet过滤器中都是不可用的。
至于获取请求cookie的具体功能需求,您似乎也完全忽略了这样一个事实,即FacesContext是ServletRequest和ServletResponse等其他方面的立面。ExternalContext all的方法在掩护下委托给ServletRequest/ServletResponse方法(在其javadoc中清楚地提到了这一点,例如getRequestCookieMap())。您需要的cookie方法只需通过doFilter()方法的doFilter()参数即可获得。
HttpServletRequest hsr = (HttpServletRequest) request;
Cookie[] cookies = hsr.getCookies();
// Loop over cookies to find the one matching the name.应该注意的是,有一个黑客/解决办法可以根据ServletRequest和ServletResponse变量在过滤器中自己创建FacesContext,但是如果这些变量本身很容易获得这些信息,这毕竟是毫无意义的。
我建议先暂停一下JSF,并学习一些基本的Servlet。这基本上就是JSF在封面下使用的内容(您可以看到,它的FacesServlet只是一个servlet)。阅读ExternalContext javadoc中的方法描述也会提示您在基本Servlet中所有这些方法都是从哪里获取它们的信息的。
https://stackoverflow.com/questions/18270094
复制相似问题