我在GlassFish 3.0.1中部署了一個相當簡單的Web應用程序。我使用常規的基於FORM的身份驗證,並使用JDBC域來保護應用程序。該視圖由使用Facelets的JSF 2處理。乾淨利落地處理會話超時Java EE 6
我遇到的問題是,當會話過期,如果用戶點擊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設置一個錯誤處理程序,但它從來沒有被調用過。我猜測系統已經被第一個例外放棄了。現在我並不太在意這種情況,只要他們沒有看到死亡的黃頁,我就會在這種情況下向用戶發送信息。
注意:非回發鏈接可以正常查找並重定向到登錄頁面。