我正在使用阶段侦听器来管理诸如登录和对话范围之类的事情。在某些情况下,我想重定向。最明显的是当用户没有登录并且他们试图访问受保护的页面时。
目前我的 PhaseListener 在恢复视图之后运行。这有时为时已晚。当用户注销页面时,页面被处理,他们被重定向回登录页面。该页面处理导致 IceFaces 中的一些 AJAX 事件 - 只有我已经销毁了会话,所以 bean 缺少状态。这会导致在恢复视图期间出现异常,这似乎是通过页面中的 EL 访问支持 bean。
如果我将阶段侦听器移动到还原视图之前并尝试使用 ExternalContext 进行重定向,我最终会得到 NullPointerException。
java.lang.NullPointerException
com.sun.faces.lifecycle.RestoreViewPhase.notifyAfter(RestoreViewPhase.java:301)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:114)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
我可以使用的一个选项是使用 Servlet 过滤器来完成这项工作。它还将涵盖非 JSF 请求。在这种情况下,我不知道有多少 JSF 可用(以及我实际需要多少),目前还不清楚我如何在 ConversationPropagationFilter 之类的事情之后和 PrettyFilter 之前使我的过滤器发生。
谢谢 - 理查德