2013-03-20 58 views
1

我想通過idlemonitor,primefaces組件處理會話超時。通過idlemonitor(primefaces)超時

我這樣做是因爲我需要讓用戶知道由於閒置會話已過期。我需要通過對話框顯示此消息,關閉對話框後,他應該重定向到登錄頁面。他不應該能夠點擊「返回」並瀏覽應用程序,就像什麼都沒有發生;如果他點擊「返回」,他應該被重定向到sessionexpired.xhtml頁面。

我把idleMonitorloggedintemplate.xhtml,所以它只能如果您已經登錄,在什麼頁面,東陽我的所有網頁,您登錄後,從顯示LoggedInTemplate派生不管。 xhtml

這是我loggedintemplate.xhtml代碼的樣子:

<p:idleMonitor timeout="6000" onidle="idleDialog.show()" /> 

<p:dialog header="Timeout" resizable="false" closable="false" 
      widgetVar="idleDialog" modal="true"> 
    <p:panel styleClass="noborderpanel"> 
     <p:panelGrid columns="1" styleClass="adressegrid"> 
      <p:outputLabel value="Session has expired due to inactivity" /> 
        <p:commandButton action="#{loginController.timeout()}" 
         value="Ok" /> 
     </p:panelGrid> 
    </p:panel> 
</p:dialog> 

所以這個代碼的功能基本上檢查,如果用戶不活躍,持續6秒,如果他是無效的,彈出一個不可關閉的對話框並告訴他該會話已過期。

的方法loginController.timeout()應註銷用戶,無效的會話等

我的問題是,我不知道如何會話無效,如何註銷用戶等如果我使用FacesContext.getCurrentInstance().getExternalContext() .invalidateSession();它會使會話無效,但我需要更多。例如,如果用戶處於非活動狀態超過30分鐘,默認的JavaEE超時時間,我會得到一個nullPointerException。

我想處理超時「手動」,有沒有辦法來禁用默認的JavaEE超時?

什麼是手動處理超時的最佳方式,而不是像這樣:

<session-config> 
    <session-timeout>20</session-timeout> 
</session-config> 
<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/expired.xhtml</location> 
</error-page> 
+0

我想如果你那句你的問題更具體你可以提高你的答案的機會。我不知道是否可以在web.xml中全部禁用會話超時。您可以將其設置爲8小時,然後以您已經這樣做的方式自行使會話失效。那麼NPE只需檢查一下。我們完全按照這種方式使用它(使用primefaces idlemonitor)。 – Jens 2013-03-20 22:16:09

+0

我不明白你的意思是「檢查這個」? – leostiw 2013-03-21 07:34:55

+0

您何時何地獲得NPE?這些'FacesContext.getCurrentInstance()。getExternalContext()。invalidateSession();'是'null'和什麼時間? (檢查這是否意味着:包括像if(objectThatCouldBeNull!= null)這樣的檢查 – Jens 2013-03-21 07:57:35

回答

2

我發現,工作相當不錯的解決方案,而我沒有要處理的NPE。

以下情形:

如果用戶是閒置超過6秒時,會話是通過AJAX無效,無需用戶交互。這意味着,即使用戶閒置超過20分鐘,該會話已經失效,我不必處理NPE。

6秒鐘後,會產生一個對話框(通過JavaScript警報),並讓用戶知道他在一段時間內不活動並且會話已過期。對話框關閉後,用戶被重定向到登錄頁面。

順便說一句,我用了6秒只是爲了測試目的。我的默認設置爲:

  • idlemonitor: 30分鐘
  • 網絡。XML: 40分鐘(只是爲了確保會話總是手動無效,並且用戶得到看到的對話框與會話過期信息)

該解決方案完全符合我的要求。

代碼idlemonitor:

<!-- language: lang-xml --> 

<p:idleMonitor timeout="1800000" > 
    <p:ajax event="idle" listener="#{loginController.timeout()}" oncomplete="alert('Session expired etc.')"/> 
</p:idleMonitor> 

代碼loginController.timeout():

public void timeout() throws IOException { 
    FacesContext.getCurrentInstance().getExternalContext() 
      .invalidateSession(); 
    FacesContext.getCurrentInstance().getExternalContext() 
      .redirect("...loginpage.xhtml"); 

}