序文 偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効であることを意味するのではなく、30 分間アイドル状態になるとセッションが削除されることを意味することを発見しました。ソースコードをざっと見てみました。少し整理整頓しました。 注:アイドル時間とは、同じセッション内の 2 つのリクエスト間の間隔を指します。 セッション関連のクラス図
マネージャー関連クラス図 StandardManager と PersitentManager はどちらも Manager の実装ですが、Session オブジェクトを保存する方法が異なります。 スタンダードマネージャー 1. Tomcatが動作しているとき、セッションはメモリに保存されます 2. Tomcat がシャットダウンすると (突然のクラッシュではなく、通常のシャットダウン操作であることに注意してください)、セッションはディスクに書き込まれ、Tomcat の再起動後に再度ロードされます。 永続マネージャー 1. セッションは常にディスクに保存します。 マネージャーとコンテキストの関係 Tomcat では、コンテキストは Tomcat にデプロイされたアプリケーション (Webapp) です。各コンテキストには、アプリケーションのセッション情報を管理するための個別の Manager オブジェクトがあります。 マネージャーがセッションを保存する方法 Managerオブジェクトは、セッションオブジェクトを保存するためにMapを使用します。
/** * このマネージャーの現在アクティブなセッションのセット。キーは * セッション識別子。 */ 保護された 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 をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: MYSQLクエリデータの結果に自動的に番号を付ける方法
>>: js は、州、市、地区の 3 段階の選択カスケードを実装します。
背景最近、面接でデータベース トランザクションについてよく質問されます。通常は、@Transacti...
置換を削除したり文字列を削除したりできる tr コマンドは、誰もがよく知っています。 英語では、英語...
目次1. 読みやすいコード1. 統一コード形式2. マジックナンバーを削除する3. 単一機能原則2....
テスターとして、学習プロセス中に Linux でソフトウェアをインストールする必要が頻繁にある場合が...
この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...
目次意味カーソルの役割カーソルの使用カーソルの宣言カーソルを開くカーソルデータのトラバースカーソルを...
ネイティブjsカプセル化シームレスカルーセルプラグイン、参考までに、具体的な内容は次のとおりです。例...
導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...
テキストオーバーフローを表示するにはどうすればいいですか? どのようなニーズがありますか?単一行です...
序文JSON は、言語に依存しないテキスト形式を使用する軽量のデータ交換形式で、XML に似ています...
プロシージャ sp_name を削除します//これまで、MYSQL 構文の基礎知識について説明して...
html <div class="totop" v-show="...
データクリーニング (ETL)コアビジネスの MapReduce プログラムを実行する前に、まずデー...
以下のように表示されます。 #!/usr/bin/env python3.5 psutilをインポー...
MyISAM と InnoDB は、MySQL で最も一般的なストレージ エンジンです。前回の記事で...