序文 偶然、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 段階の選択カスケードを実装します。
公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...
目次概要データ URL の使用を開始するデータURL構文複数言語の文字列のBase64エンコードとデ...
1. 仮想環境はプロジェクトに従い、単一のプロジェクト用の仮想環境を作成します(Python 3.4...
Web デザインにおけるツリーとは何ですか?簡単に言うと、リンクをクリックするとサブディレクトリが展...
目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...
コードが失われ、コンテナ内で実行されているイメージから必要なコードを回復する必要がある場合があります...
目次ジェネリック型での条件型の使用ツールタイプ脱出ポッド矢印関数で条件型を使用する型推論による条件型...
この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...
<br />緑は黄色と青(寒色と暖色)の中間の色で、より穏やかな色です。そのため、緑は最...
私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...
視覚効果が非常に美しく、訪問者に強い印象を残すことがわかります。さらに、重要なポイントが強調され、訴...
フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...
CSS インポート方法 - インラインスタイルタグ属性を通じて、CSSのキーと値のペアがタグに直接書...
目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...
目次1. コンポーネントの紹介2. コンポーネントの内部構造とロジック1. コード組織構造2. マッ...