私はサイドoc4jにデプロイされたサーブレットアプリを持っています。
次を使用して、数分後にユーザーセッションを無効にしようとしています1
:
session.setMaxInactiveInterval(1 * 60);
しかし、何が起こるかというと、セッションが破棄されるまでに 1 分以上かかります (1 分半に達する場合もあります)。
これは実装の問題ですか、それとも何ですか?
私はサイドoc4jにデプロイされたサーブレットアプリを持っています。
次を使用して、数分後にユーザーセッションを無効にしようとしています1
:
session.setMaxInactiveInterval(1 * 60);
しかし、何が起こるかというと、セッションが破棄されるまでに 1 分以上かかります (1 分半に達する場合もあります)。
これは実装の問題ですか、それとも何ですか?
HttpSessionListener#sessionDestoryed()
正確に 1 分後にサーバーに HTTP リクエストを実際に送信するのではなく、get が呼び出されるまで待って破棄をチェックしているようです。
セッションの破棄は、間隔で実行されるバックグラウンド ジョブによって管理されるほとんどのサーバーで行われます。これは、サーバーのメーカー/バージョン、構成、および場合によっては負荷に応じて、1 分ごとまたはそれ以上になる可能性があります。このジョブは、有効期限が切れているかどうかに関係なく、開いているすべてのセッションをチェックし、それに応じて期限切れのセッションをスイープします。したがって、クライアントがリクエストを送信していない限り、セッションの有効期限が切れたのと同じ秒でセッション破棄がすぐに呼び出されるというのは正しくありません。このバックグラウンド ジョブは毎秒実行されるわけではないため、CPU の負荷が高すぎます。
ただし、セッションがまだサーバーのメモリに存在しているが期限切れになっている間に、サーバーがセッション ID を使用してリクエストを取得するたびに、セッション破棄がすぐに呼び出されます。
したがって、それを受け入れるか、テスト方法を変更する必要があります。