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 段階の選択カスケードを実装します。

推薦する

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...

JS はデータ URL をどのように理解するのでしょうか?

目次概要データ URL の使用を開始するデータURL構文複数言語の文字列のBase64エンコードとデ...

Ubuntuのpython3でvenvを使用して仮想環境を作成する

1. 仮想環境はプロジェクトに従い、単一のプロジェクト用の仮想環境を作成します(Python 3.4...

HTML&CSS&JS 互換性ツリー (IE、Firefox、Chrome)

Web デザインにおけるツリーとは何ですか?簡単に言うと、リンクをクリックするとサブディレクトリが展...

JS の toFixed() メソッドの丸め精度の問題の詳細な説明

目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...

Dockerコンテナイメージからコードを復元する手順

コードが失われ、コンテナ内で実行されているイメージから必要なコードを回復する必要がある場合があります...

TypeScript の条件型に関する詳細な読書と実践記録

目次ジェネリック型での条件型の使用ツールタイプ脱出ポッド矢印関数で条件型を使用する型推論による条件型...

jQuery はシャッター効果を実現します (li 配置を使用)

この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...

ウェブページのカラーマッチング例分析: 緑色のカラーマッチングウェブページ分析

<br />緑は黄色と青(寒色と暖色)の中間の色で、より穏やかな色です。そのため、緑は最...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

イラスト風ウェブサイトホームページデザイン ウェブサイトデザインの新トレンド

視覚効果が非常に美しく、訪問者に強い印象を残すことがわかります。さらに、重要なポイントが強調され、訴...

フロントエンドページのポップアップマスクはページのスクロールを禁止します

フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...

CSS ファイルをインポートする 4 つの方法 (インライン、インライン、外部、インポート) の詳細な説明

CSS インポート方法 - インラインスタイルタグ属性を通じて、CSSのキーと値のペアがタグに直接書...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...

iframeをカプセル化するvueコンポーネントを開発する

目次1. コンポーネントの紹介2. コンポーネントの内部構造とロジック1. コード組織構造2. マッ...