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

如何在过滤器中检索 FacesContext?

我关注了以下关于如何在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 范围来保存一些数据和消息,这不起作用。

【问题讨论】:

    标签: jsf servlet-filters facescontext flash-scope


    【解决方案1】:

    如何在过滤器中检索 FacesContext?

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

    你有两个选择:

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

    2. 不要使用 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 会很好用。
    猜你喜欢
    • 2012-06-16
    • 2013-08-22
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多