使用Java EE 6干净地处理会话超时

我在GlassFish 3.0.1中部署了一个相当简单的Web应用程序。我正在使用常规的基于FORM的身份验证,并使用JDBC领域保护应用程序。该视图由JSF 2使用Facelets处理。 我遇到的问题是,当会话到期时,如果用户单击h:commandButton或其他任何回发的内容,则会显示一个糟糕的黄页,告诉他们存在XML分析错误。在日志中我得到三个堆栈跟踪:
INFO: PWC2787: Session event listener threw exception
org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:679)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:138)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
<snip>

WARNING: ApplicationDispatcher[/core] PWC1231: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.application.ViewExpiredException: viewId:/login.xhtml - View /login.xhtml could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
<snip>

WARNING: Unexpected error forwarding or redirecting to login page
javax.servlet.ServletException: viewId:/login.xhtml - View /login.xhtml could not be restored.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:822)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:517)
<snip>
我似乎无法找到一个干净简单的方法来处理这个问题。我已经尝试在web.xml中为ViewExpiredException设置一个错误处理程序,但它从未被调用过。我猜这个系统已经放弃了第一个例外。现在我不太关心我在这种情况下发送用户的地方,只要他们没有看到死亡的黄页! 注意:非回发链接可以正常查找并重定向到登录页面。     
已邀请:
不幸的是,没有标准的方法可以解决这个问题,至少在我做了一些研究后我们发现了什么。 你能做的是: (1)在faces-config.xml中注册自己的JSF-ExceptionHandler并使其处理你想要的任何异常,然后重定向到error- / login-page。不完全是微不足道的,但绝对可能 - 这就是我们如何做到的。 (2)看看(并使用)Seam-Catch,它们使用相同的机制(但是以更优雅的CDI方式),我们没有使用它,因为它在两个月前还没有准备好。     

要回复问题请先登录注册