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);
}
[...]
Run Code Online (Sandbox Code Playgroud)
执行 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());
}
}
[...]
Run Code Online (Sandbox Code Playgroud)
context.getExternalContext().getRequestCookieMap(); 给出
StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
在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.
Run Code Online (Sandbox Code Playgroud)
应该注意的是,有一个hack/workaround可用于FacesContext根据ServletRequest和ServletResponse变量自己在过滤器中创建,但是如果这些变量本身中的信息很容易获得,那么这毕竟没有完全意义。
我建议暂停 JSF 并学习基本的 Servlet API。这基本上就是 JSF 在幕后使用的内容(你看,它FacesServlet“只是”一个 servlet)。阅读ExternalContextjavadoc 中的方法描述还应该提示您所有这些方法在基本 Servlet API 中的确切位置获取它们的信息。
| 归档时间: |
|
| 查看次数: |
2025 次 |
| 最近记录: |