序文 偶然、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 段階の選択カスケードを実装します。
<br /> テキスト、記号、リンクの3つの側面に焦点を当て、主に中国語で、個人的な執筆...
序文プロジェクトでは中間層としてNodeを使用し、Nodeのデプロイにはdockerを使用します。こ...
1. 概要いわゆるライフサイクル機能とは、特定の条件下で自動的にトリガーされる機能です。 2. VU...
目次序文1.無視を挿入2. 重複キーの更新時3. を置き換える4.存在しない場合は挿入する5. デー...
1. MySQL ログイン設定を変更します。 # vim /etc/my.cnf文を追加: skip...
メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...
予備的注釈1.Vue2.xとVue3.xの違い: Vue 3.x にはヘルパー関数はありません。 V...
monaco-editor-vueの公式ソースコードは次のとおりです。インデックス 'mon...
ステップ1:setting.pyでデータベースを変更する # データベースを構成する DATABAS...
この記事では主に、ElementUI テーブルのヘッダー アイコンにフローティング プロンプトを追加...
DockerのインストールDocker はオープンソースなので、Windows システムへのインスト...
導入js コード文の末尾にセミコロンを追加しても追加しなくても問題ありません。一般的に、チームで開発...
さっそく、コードを見てみましょう(初心者:特に言うことはありません) <!DOCTYPE ht...
例えば、入力ボックスがあります <el-入力 ref="mySearch"...
目次概要ビルドプロセス関連APIリードライン基本的な使い方チョーククリア手順に関する追加情報完全なコ...