Primefacesコンポーネントであるidlemonitorを介してセッションタイムアウトを処理しようとしています。
これを行っているのは、非アクティブのためにセッションが期限切れになったことをユーザーに通知する必要があるためです。ダイアログを介してこのメッセージを表示する必要があります。ダイアログを閉じた後、ログインページにリダイレクトされます。何も起こらなかったのと同じように、彼は「戻る」をクリックしてアプリケーションを参照できないはずです。「戻る」をクリックすると、sessionexpired.xhtmlページにリダイレクトされます。
私はidleMonitorをloggedintemplate.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>