gpt4 book ai didi

jsf - @WebFilter 和 FacesContext.getCurrentInstance() -> 空指针

转载 作者:行者123 更新时间:2023-12-03 22:49:58 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个 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

最佳答案

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

至于抓取请求cookies的具体功能需求,你似乎也完全忽略了FacesContext这个事实。是 facade其中包括 ServletRequestServletResponse . 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)。阅读 ExternalContext 中的方法说明javadoc 还应该提示您所有这些方法在基本 Servlet API 中的确切位置获取它们的信息。

关于jsf - @WebFilter 和 FacesContext.getCurrentInstance() -> 空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18270094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com