如何在过滤器中检索 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 已经可用的所有东西的抽象,例如 HttpServletRequest
、HttpSession
、ServletContext
等。只需像 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
监听beforePhase
的RENDER_RESPONSE
会很好用。以上是关于如何在过滤器中检索 FacesContext的主要内容,如果未能解决你的问题,请参考以下文章
如何检索由指定字符串过滤的 Java 中的 AWS AutoScalingGroups 列表?
如何使用 WooCommerce 检索 cart_item_data?