如何在过滤器中检索 FacesContext

Posted

技术标签:

【中文标题】如何在过滤器中检索 FacesContext【英文标题】:How do I retrieve the FacesContext within a Filter 【发布时间】:2012-12-12 06:52:22 【问题描述】:

我关注了以下关于如何在Filter 中检索FacesContext 的文章:

http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/

但问题是它不适用于 Flash 范围。抛出以下 NPE:

java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751)
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112)

我想在我的过滤器中添加重定向并使用 flash 范围来保存一些数据和消息,这不起作用。

【问题讨论】:

【参考方案1】:

如何在过滤器中检索 FacesContext?

你不能。 FacesContext 是由FacesServlet 创建的,因此只能在FacesServlet 处理的任何Java 代码中使用,它涵盖了所有JSF 工件,例如托管bean 和阶段侦听器。文章只展示了如何手动创建FacesContext,但这种方法最终是没有用的。 FacesContext 只是标准 Servlet API 已经可用的所有东西的抽象,例如 HttpServletRequestHttpSessionServletContext 等。只需像 JSF“幕后”那样直接使用它们。

你有两个选择:

    请改用 JSF PhaseListener。根据您没有说明的具体功能要求,这可能是一个相当笨拙的解决方案/解决方法。

    不要使用 JSF 提供的 Flash 范围工具,而是自己自制一个。原理相当简单:在初始请求中设置 cookie,发送重定向,在重定向请求中查找 cookie 将其删除(以便在任何后续请求中不再存在)。这正是 JSF Flash 作用域的工作原理。具体示例参见Set notification message as request attribute which should show after sendRedirect。

【讨论】:

“因此仅在由 FacesServlet 处理的任何 Java 代码中可用,它涵盖了所有 JSF 工件,例如托管 bean”现在我很困惑。当我使用 HttpSession.getAttribute() 查找托管 bean 时,当前 FacesContext 仍然为空。 过滤器在FacesServlet之前运行。因此,在 FacesServlet 运行之前从 JSF 存储“幕后”的那里获取会话范围的托管 bean 不会让您访问 FacesContext @BalusC: 如果我想在 FacesContext 可用的 FacesServlet 中拦截请求/响应怎么办?我想在所有响应中设置一些 cookie,Filter 是理想的位置。但是,这些值取决于在 FacesContext 中评估和设置的某些功能,这些功能在 Filter 中为 null。能否请您指导如何处理这种情况? @BalusC:也就是说,FacesServlet 中是否有一个地方我可以简单地拦截所有 ServletRequest/Response(就像我们在普通过滤器中所做的那样)并设置一些 cookie? @Nik: 一个PhaseLIstener 监听beforePhaseRENDER_RESPONSE 会很好用。

以上是关于如何在过滤器中检索 FacesContext的主要内容,如果未能解决你的问题,请参考以下文章

如何检索由指定字符串过滤的 Java 中的 AWS AutoScalingGroups 列表?

如何使用 WooCommerce 检索 cart_item_data?

如何使用 columns().every() 仅检索带有过滤元素的列

如何使用外部 AJAX 调用检索数据表过滤器?

elasticSearch - 高级检索

如何在搜索/过滤数据期间处理空字段?