2011-03-25 51 views
3

我在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設置一個錯誤處理程序,但它從來沒有被調用過。我猜測系統已經被第一個例外放棄了。現在我並不太在意這種情況,只要他們沒有看到死亡的黃頁,我就會在這種情況下向用戶發送信息。

注意:非回發鏈接可以正常查找並重定向到登錄頁面。

回答

1

不幸的是,沒有標準的方法來解決這個問題,至少在做了一些研究之後我們沒有發現。

你可以做的是:

(1)註冊自己的JSF-的ExceptionHandler faces-config.xml中,並使其處理您要,重定向到後來無錯誤/登錄頁的任何異常。不是完全微不足道的,但絕對有可能 - 我們是這麼做的。 (2)看看(和使用)Seam-Catch,他們使用的是同樣的機制(但是採用更加優雅的CDI標準方式),我們沒有使用它,因爲它在兩個月前還沒有準備好。