Tomcat でタイムアウトしたセッションを監視および削除する方法

Tomcat でタイムアウトしたセッションを監視および削除する方法

序文

偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効であることを意味するのではなく、30 分間アイドル状態になるとセッションが削除されることを意味することを発見しました。ソースコードをざっと見てみました。少し整理整頓しました。

注:アイドル時間とは、同じセッション内の 2 つのリクエスト間の間隔を指します。

セッション関連のクラス図


  • HttpSession は、サーブレット層で直接使用できるセッションです。
  • セッションはTomcatが内部的に使用するインターフェースであり、いくつかの内部呼び出しを実行できる。
  • StandardSession は標準の HttpSession 実装です。また、Tomcat の内部管理用の Session インターフェイスも実装します。
  • StandardSessionFacade は、クラス名からすでに「ファサード クラス」であることが示されています。このクラスは、内部的には StandardSession オブジェクトを参照しますが、外部に対しては HttpSession によって指定されたメソッドのみを提供します。

マネージャー関連クラス図


StandardManager と PersitentManager はどちらも Manager の実装ですが、Session オブジェクトを保存する方法が異なります。

スタンダードマネージャー

1. Tomcatが動作しているとき、セッションはメモリに保存されます

2. Tomcat がシャットダウンすると (突然のクラッシュではなく、通常のシャットダウン操作であることに注意してください)、セッションはディスクに書き込まれ、Tomcat の再起動後に再度ロードされます。

永続マネージャー

1. セッションは常にディスクに保存します。

マネージャーとコンテキストの関係

Tomcat では、コンテキストは Tomcat にデプロイされたアプリケーション (Webapp) です。各コンテキストには、アプリケーションのセッション情報を管理するための個別の Manager オブジェクトがあります。

マネージャーがセッションを保存する方法

Managerオブジェクトは、セッションオブジェクトを保存するためにMapを使用します。

  • キー => セッションID
  • 値 => セッションオブジェクト
 /**
  * このマネージャーの現在アクティブなセッションのセット。キーは
  * セッション識別子。
  */
 保護された Map<String, Session> sessions = 新しい ConcurrentHashMap<>();

リクエストがコンテキストに到着すると、リクエストに JSESSIONID Cookie が含まれている場合、マネージャーは関連付けられたセッション オブジェクトを見つけて、それをリクエスト オブジェクトに格納できます。

管理者の定期検査

Manager インターフェイスには backgroundProcess() メソッドがあり、これは名前が示すようにバックグラウンド処理です。

/**
  * このメソッドは、定期的にコンテキスト/コンテナによって呼び出されます。
  * ベースで、マネージャーが実装できるようにします
  * セッションの期限切れなどの定期的なタスクを実行するメソッド。
  */
 パブリック void backgroundProcess();

注: Container インターフェイスにもこのメソッドがあります。このメソッドは通常、コンテナーの起動時に backgroundProcess メソッドを実行するための追加のスレッドを開始します。 Context のこのメソッドが開始されると、Loader と Manager の backgroundProcess メソッドが実行されます。

このメソッドが何をするのか見てみましょう。

/**
 * {@inheritDoc}
 * <p>
 * {@link #processExpires()} への直接呼び出し
 */
@オーバーライド
パブリック void backgroundProcess() {
 カウント = (カウント + 1) % プロセス有効期限頻度;
 if (count == 0) // チェック頻度に達したら、チェックを開始します processExpires();
}

/**
 * 期限切れのセッションをすべて無効にします。
 */
パブリックボイドプロセス期限切れ() {

 長いtimeNow = System.currentTimeMillis();
 セッション sessions[] = findSessions(); //すべてのセッションオブジェクトを取得します int expireHere = 0 ; //期限切れのセッションの数。この変数名に惑わされないでください if(log.isDebugEnabled())
  log.debug("" + getName() + " の期限切れセッションを " + timeNow + " sessioncount " + sessions.length に開始します);
 (int i = 0; i < sessions.length; i++) {
  セッション[i]がnullの場合、セッション[i].isValid()がtrueになります。
   ここで期限切れ++;
  }
 }
 長いtimeEnd = System.currentTimeMillis();
 if(log.isDebugEnabled()) //レコードを印刷 log.debug("期限切れセッションの終了 " + getName() + " processingTime " + (timeEnd - timeNow) + " 期限切れセッション: " + expireHere);
 処理時間 += ( 終了時間 - 現在時間 );

}

これを見て私と同じ疑問を抱く人も多いと思いますが、セッションを期限切れにする操作はなく、ステータスチェックのみ行われているようです。しかし、後で Session の isValid メソッドの実装を見て、すべて理解できました。

/**
 * このセッションの <code>isValid</code> フラグを返します。
 */
@オーバーライド
パブリックブール値isValid() {

 (これが有効である場合){
  false を返します。
 }

 if (this.expiring) {
  true を返します。
 }

 ACTIVITY_CHECK && accessCount.get() > 0 の場合 {
  true を返します。
 }

 //キーポイント //最大アイドル時間が設定されている場合は、 //このセッションのアイドル時間を取得して判断します //タイムアウトした場合は、expire操作を実行します if (maxInactiveInterval > 0) { 
  内部IdleTimeInternal() は、内部IdleTimeInternal() の次の値を返します。
  (timeIdle >= maxInactiveInterval)の場合{
   有効期限が切れます(true);
  }
 }

 this.isValid を返します。
}

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Java 開発におけるパフォーマンス分析に JVisualVM を使用する方法
  • LambdaProbe を使用して Tomcat を監視する方法
  • Tomcat 経由で JMX 監視を有効にする方法
  • Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル
  • Linux でシェル スクリプトを使用して Tomcat の状態を監視し、自動的に起動する手順
  • Python スクリプトによる Tomcat サーバー監視方法
  • Java 仮想マシンは jvisualvm ツールを使用して Tomcat メモリをリモートで監視します。

<<:  MYSQLクエリデータの結果に自動的に番号を付ける方法

>>:  js は、州、市、地区の 3 段階の選択カスケードを実装します。

推薦する

誰もが登録できるようにJiedaibaoを宣伝するにはどうすればよいでしょうか? ジエダイバオのプロモーション方法とスキル

借財宝は最近人気が出ている携帯電話ローンソフトウェアプラットフォームです。知人同士の貸し借りが特徴で...

2級コンピュータ試験のMySQL知識ポイント mysql alterコマンド

テーブル構造を編集するための MySQL の alter コマンドの使用。具体的な内容は以下のとおり...

div を下から上にスライドさせる CSS3 の例

1. まず、CSS3 のターゲット セレクターを使用し、a タグを使用して id セレクターを指定し...

MySQL 8.0.24 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 8.0.24バージョンのインストールと設定方法を記録し、皆さんと共有しますM...

MySQL InnoDB ロックの概要

目次1. 共有ロックと排他ロック2. 意図ロック3. レコードロック4. ギャップロック5. ネクス...

MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明

同僚から、MySQL データ型 DECIMAL(N,M) の N と M の意味を尋ねられました。言...

Vuex はシンプルなショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのvuexの具体的なコードを参考までに共有して...

Vueのコンポーネントのprops属性について詳しく説明します

目次質問1: 小道具は具体的にどのように使用されますか?原理は何ですか?下を見る質問 2: 年齢に ...

JavaScript でシンプルなクリスマス ゲームを実装する

目次序文成果を達成するコードCSSコードJSコードHTMLコードデモンストレーションのプロセス序文ク...

Minio 軽量オブジェクト ストレージ サービスのインストールとブラウザの使用チュートリアル

目次導入インストール1. マウントするフォルダを作成する2. イメージをプルする3. コンテナを作成...

HTML で相対パスを使用してディレクトリのすべてのレベルのファイルを取得する方法の詳細な説明

相対パスの概念現在のファイルの場所を参照ポイントとして使用して、ターゲット ファイルへのパスを確立し...

同じページを動的にロードするための Vue ルーティングリスニングの例

目次シナリオ分析発達要約するシナリオ分析システムでは、1 つのモジュールに 3 つのサブモジュールが...

ページ下部のフッターを修正する方法(複数の方法)

フロントエンド Web エンジニアとして、ページ効果を作成するときに次の現象に遭遇したことがあるはず...

MySQLステートメントを監視する方法の詳細な説明

クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...