0

と の 2 つの Web ページがindex.xhtmlありsessionExpiry.xhtmlます。目的はsessionExpiry.xhtml、タイムアウト時にユーザーをページにリダイレクトすることです。でセッション タイムアウトを 1 分にしましたweb.xml。タグを使用http-equiv=refreshして、タイムアウト時にユーザーをリダイレクトしています。 には、何も入力しないとindex.xhtmlエラー メッセージが表示される必須のテキスト フィールドがあります。セッションの作成と破棄を記録onblur eventする が追加されました。HttpSessionListener

テスト シナリオ:ブラウザーで Web ページを開き、サーバー ログにセッション作成時間が表示され、15 秒後に入力テキスト ボックスをクリックし、外側をクリックするとリッチ エラー メッセージが表示されます。Web ページをアイドル状態のままにすると、Web ページsessionExpiry.xhtmlは 1 分後にリダイレクトされます (これは 1 分 15 秒後に発生すると予想していました) が、サーバー ログのセッション破棄メッセージは約 2 ~ 3 分後に発生します。

セッションの破棄が遅れるのはなぜですか? AJAX イベント後に 1 分間非アクティブになった後にセッションの有効期限が切れるようにするにはどうすればよいですか? 以下はソースコードです。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        1
    </session-timeout>
</session-config>
<listener>
    <listener-class>com.sessiontimeout.HttpSessionChecker</listener-class>
</listener>
<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:rich="http://richfaces.org/rich">
    <h:head>
        <title>Facelet Title</title>
        <meta http-equiv="refresh" content="#{session.maxInactiveInterval};url=./sessionExpiry.xhtml" />
    </h:head>
    <h:body>
        <h:form>
            Hello from Facelets
            <h:panelGrid columns="3">
                Enter some text:
                <h:inputText id="txt" required="true" maxlength="16" size="20"
                             autocomplete="off" requiredMessage="Text is Required">
                    <f:ajax event="blur" render="txtmsg" />
                </h:inputText>
                <rich:message id="txtmsg" for="txt" />
            </h:panelGrid>
        </h:form>
    </h:body>
</html>

sessionExpiry.xhtml

<h:body>
        Session Timed out after ${session.maxInactiveInterval/60} minutes of inactivity.
</h:body>

HttpSessionChecker.java

public class HttpSessionChecker implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("Session ID " + event.getSession().getId() + " created at " + new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.println("Session ID " + event.getSession().getId() + " destroyed at " + new Date());
    }

}
4

1 に答える 1

0

これが1分15秒後に起こると思っていた

タイムアウトを 1 分に設定したため、1 分後にタイムアウトしました。そのメタ要素を更新するために同期ポストバックを実行するか、ajax 呼び出しが成功したときに JS を介してその要素を更新する必要があり、おそらくイベントが長引いてしまいます ( Is it possible to use javascript to change the meta-tags of the page? を参照してください)。

サーバーログのセッション破棄メッセージは、約 2 ~ 3 分発生しています。

タイムアウト イベント時にコンテナーによってセッションが無効化される正確なタイミングに制限はありません(「セッション タイムアウトの認識」を参照)。コントラクトは、ある時点で無効になることを示していますが、タイムアウトした正確なタイミングではなく、アクティブとしてカウントされなくなります。即時の無効化には、代わりに無効化して送信するリダイレクト アプローチがあります ( session.invalidate を使用した JSF ログアウトは現在のユーザー名をクリアしませんか? を参照してください)。

セッションの破棄が遅れるのはなぜですか? AJAX イベント後に 1 分間非アクティブになった後にセッションの有効期限が切れるようにするにはどうすればよいですか?

これらの質問は基本的に上記で回答されています。セッションの有効期限イベントを適切に処理する方法については、次の質問も参照してください。

  1. JSF 2でセッションの有効期限とViewExpiredExceptionを処理するには?
  2. javax.faces.application.ViewExpiredException: ビューを復元できませんでした
  3. JSF/PrimeFaces ajax リクエストでのセッション タイムアウトと ViewExpiredException の処理
于 2013-08-01T20:13:23.633 に答える