2

Primefacesコンポーネントであるidlemonitorを介してセッションタイムアウトを処理しようとしています。

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

1 に答える 1

3

非常にうまく機能するソリューションを見つけました。NPE に対処する必要はありません。

次のシナリオ:

ユーザーが 6 秒以上アイドル状態の場合、セッションは ajax によって無効化され、ユーザーの操作は必要ありません。つまり、ユーザーが 20 分以上アイドル状態だったとしても、セッションは既に無効になっているため、NPE に対処する必要はありません。

6 秒後、(javascript アラートを介して) ダイアログが生成され、一定時間非アクティブであり、セッションが期限切れになったことをユーザーに知らせます。ダイアログが閉じられると、ユーザーはログイン ページにリダイレクトされます。

ちなみに、テスト目的で6秒を使用しました。私のデフォルト設定は次のとおりです。

  • アイドルモニター: 30 分
  • web.xml: 40 分 (セッションが常に手動で無効化され、ユーザーがセッションの期限切れ情報を含むダイアログを表示できるようにするため)

このソリューションは、私の要件と完全に一致します。

アイドルモニターのコード:

<!-- 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");

}
于 2013-03-21T10:26:04.200 に答える