tim*_*nYE 4 jsf servlet-filters
在我的应用程序中,我有一个 WebFilter。这个 Webfilter 应该检查一个 coockie。但是使用 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
在FacesContext被创建FacesServlet。在任何 servlet之前调用任何 servlet 过滤器。该FacesContext因此每在任何Servlet过滤器不可用的定义。
至于抓住请求中的Cookie的具体功能要求,也似乎完全忽略的事实,FacesContext是一个正面的以及其他的ServletRequest和ServletResponse。的方法中ExternalContext的盖到下的所有委托ServletRequest/ServletResponse方法(这在其明确提及的javadoc,例如getRequestCookieMap())。您需要的 cookie 方法可以通过方法的ServletRequest参数轻松获得doFilter()。
HttpServletRequest hsr = (HttpServletRequest) request;
Cookie[] cookies = hsr.getCookies();
// Loop over cookies to find the one matching the name.
应该注意的是,有一个hack/workaround可用于FacesContext根据ServletRequest和ServletResponse变量自己在过滤器中创建,但是如果这些变量本身中的信息很容易获得,那么这毕竟没有完全意义。
我建议暂停 JSF 并学习基本的 Servlet API。这基本上就是 JSF 在幕后使用的内容(你看,它FacesServlet“只是”一个 servlet)。阅读ExternalContextjavadoc 中的方法描述还应该提示您所有这些方法在基本 Servlet API 中的确切位置获取它们的信息。
| 归档时间: | 
 | 
| 查看次数: | 2025 次 | 
| 最近记录: |