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

推薦する

デザイン理論: コンテンツプレゼンテーションのための 10 のヒント

<br /> テキスト、記号、リンクの3つの側面に焦点を当て、主に中国語で、個人的な執筆...

Docker で Node.js をデプロイする方法

序文プロジェクトでは中間層としてNodeを使用し、Nodeのデプロイにはdockerを使用します。こ...

Vue3ライフサイクル関数とメソッドの詳細な説明

1. 概要いわゆるライフサイクル機能とは、特定の条件下で自動的にトリガーされる機能です。 2. VU...

MySQL の挿入およびバッチ ステートメントのいくつかの例の詳細な説明

目次序文1.無視を挿入2. 重複キーの更新時3. を置き換える4.存在しない場合は挿入する5. デー...

Centos で MySQL パスワードを変更する方法

1. MySQL ログイン設定を変更します。 # vim /etc/my.cnf文を追加: skip...

HTML メタタグの使用の概要 (推奨)

メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...

Vuex でゲッターとアクションを使用するための追加手順

予備的注釈1.Vue2.xとVue3.xの違い: Vue 3.x にはヘルパー関数はありません。 V...

Vueはソースコード付きのリファレンスライブラリのメソッドを使用します

monaco-editor-vueの公式ソースコードは次のとおりです。インデックス 'mon...

Django がローカル MySQL データベースに接続する手順 (pycharm)

ステップ1:setting.pyでデータベースを変更する # データベースを構成する DATABAS...

ElementUIテーブルのヘッダーアイコンにフローティングプロンプトを追加します。

この記事では主に、ElementUI テーブルのヘッダー アイコンにフローティング プロンプトを追加...

DockerをインストールしてAlibaba Cloud Image Acceleratorを構成する方法

DockerのインストールDocker はオープンソースなので、Windows システムへのインスト...

VSCode の JS フォーマットでセミコロンを自動的に追加または削除する方法について

導入js コード文の末尾にセミコロンを追加しても追加しなくても問題ありません。一般的に、チームで開発...

シンプルなナビゲーションバー機能を実現するHTML+CSS

さっそく、コードを見てみましょう(初心者:特に言うことはありません) <!DOCTYPE ht...

ElementUIカスタムCSSスタイルが有効にならない問題を解決する

例えば、入力ボックスがあります <el-入力 ref="mySearch"...

ゲームの Node.JS バージョンを作成する方法

目次概要ビルドプロセス関連APIリードライン基本的な使い方チョーククリア手順に関する追加情報完全なコ...