使用WebFilter时p:barChart标签触发NullPointerException异常问题咨询
错误诱因
你遇到的空指针异常是编码逻辑疏漏导致的,和Primefaces类库、依赖缺失、过滤器本身能力无关,具体问题出在两处:
- 权限路径校验逻辑未做非空判断:你从Session中取出
paths属性后直接调用stream()方法,如果Session中该属性不存在、或因Session失效被清空,会直接抛出空指针异常。该异常属于RuntimeException,没有被你当前的catch块捕获,会向上抛给Servlet容器,栈追踪就会指向filterChain.doFilter这一行。 - 过滤器逻辑存在分支漏判:你只处理了ServletRequest是HttpServletRequest的场景,如果请求类型不匹配,你既没有执行后续过滤器链,也没有返回响应,会导致部分特殊请求挂起。
Primefaces柱状图触发异常的原因是:图表渲染时会发起匹配/dashboard/*规则的资源/数据请求,该请求会经过你的SecurityFilter,刚好触发了上述的空指针逻辑。
修复方案
- 补充paths属性非空校验,空值场景按会话失效处理:
@SuppressWarnings("unchecked") List<String> paths = (List<String>) req.getSession().getAttribute("paths"); // 新增非空判断 if (paths == null) { HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; httpResponse.sendRedirect(req.getContextPath() + "/error/expired.xhtml"); return; } boolean valContext = paths.stream().anyMatch(currentModule::endsWith);
- 补全非HttpServletRequest场景的处理逻辑:
if (servletRequest instanceof HttpServletRequest) { // 原有逻辑保持不变 } else { // 非HTTP请求直接放行 filterChain.doFilter(servletRequest, servletResponse); }
- 可选择性添加Primefaces资源请求白名单,减少不必要的校验逻辑:在过滤器开头判断请求URI如果是JSF静态资源、Primefaces组件资源,直接跳过校验执行过滤器链即可。
内容的提问来源于stack exchange,提问作者Dagon
相关产品推荐
相关产品推荐

