ホームページ >Java >&#&チュートリアル >Springboot2のセッションタイムアウト設定が無効になる問題の解決方法
今日、プロジェクトで設定タイムアウトの問題が発生し、SpringBoot2 の application.properties の変更が反映されませんでした。
Spring Boot によって使用される組み込みコンテナーは、server.* プロパティによって制御されます。 Spring Boot は、ServletWebServerFactory インスタンスの 1 つを使用してサーブレット コンテナのインスタンスを作成します。これらのクラスは、server.* 属性を使用して、管理対象サーブレット コンテナ (Tomcat、Jetty など) を構成します。
アプリケーションが war ファイルにパッケージ化され、Tomcat インスタンスにデプロイされる場合、server.* 属性は使用できません。事前に作成されたサーブレット コンテナを利用できるため、これらは適用されません (サービスがリモートで実行されているため)。したがって、リモート Tomcat にデプロイすると、server.* プロパティが役に立たなくなります。
Extension:Duration
スプリングブート ソース コードを表示すると、setTimeouot メソッドが見つかります。ここでは、Duration のインスタンスを渡す必要があります。
server: servlet: session: timeout: PT1H # 1小时过期 cookie: max-age: PT1H # 1小时过期
Duration は新しいですJava8 では、主に日付の差分、期間の計算に使用され、最終的に宣言され、スレッドセーフです。
文字列を変換する場合、それは SimpleDateFormat
Duration の日付書式設定メソッドに似ています。文字列は、正と負の数値に似ています。デフォルトは正で、負の値から始まります。 「-」の後に「PT」、次の時間文字が続きます:
2. tomcat のセッション タイムアウトを設定します
public void setTimeout(Duration timeout) { this.timeout = timeout; }
2) プロジェクト内の web.xml を変更します:
<Context path="/abtest" docBase="/abtest" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
3) プログラムの変更
<session-config> <session-timeout>20</session-timeout> </session-config>
同じ問題が発生した場合は、上の赤い文字を読んで、順番にトラブルシューティングを行ってください。
テスト コード:
session.setMaxInactiveInterval(30*60);
時間の同期外れによる Spring セッションの失敗を引き起こす大きな穴
Spring セッションの失敗を引き起こす大きな穴Linux サーバーの時刻が同期していないためビジネス上の必要により、元のスタンドアロン環境をクラスター環境に変換し、タスクを変更しないように Spring Session Redis を選択しましたセッション共有ソリューションとして。
技術的な解決策を確認した後、インターネットで春セッションに関する多くの情報を検索し、読んだ後、前の人の落とし穴が見つからなかったので、作業を開始しました。
redis のインストール プロセスは無視されます。情報に従って、段階的にプロジェクトに Spring セッションを追加します。単一ノード プロジェクトはエラーなしで正常に実行され、セッションは Redis に正常に書き込まれました。
次に、安全のため、コンピューターに nginx をインストールし、3 つの Tomcat をデプロイしました。すべてが完璧に見え、複数のノード間でセッション共有が完了しました。
ここまでで下準備はすべて完了し、あとは最後のステップを残すだけです。
悪夢の始まり...
すべてのノードをオンラインにデプロイし、ブラウザを開いてアプリケーションに正常にアクセスします。もちろん、ページが完成したので、何としてもやらなければなりません。ログインしてログインしてください...
その後...
ユーザー パスワードを何度も入力し、ログインは成功しましたが、最終結果は依然として拒否されました。o(╥﹏╥)o
次のステップは、無数の落とし穴を埋めることです
ログを見てください...
さまざまなリクエストリクエストを見てください...
春のセッションにバグがあるのではないかと思います... ...
リモート DEBUG モードのデバッグもオンにして、最終的に確認しましたユニバーサル DEBUG モードでは、スプリング セッションが getSession を取得するときに、セッションが取得された場合、
は最初にセッションが期限切れかどうかを判断し、比較します。方法も非常に簡単で、現在のシステム時刻を取得してそれと比較します。セッションの有効期限。現在時刻が有効期限よりも小さい場合、セッションの有効期限が切れていないことを示します。これを見て、私は一瞬にして悟りのような感覚を覚え、ついにここに小宇宙が勃発したのです。 Nima—>取得したセッションがすべて期限切れになってしまい…その後…もちろん慌ててサーバー時間を確認しに行ったので…泣いてしまいましたo(╥﹏╥)o 、それはニマだった 私を騙したのはあなただった...
この罠に横たわる旅を記念するために、この記事を投稿します
さらに, ちなみに、Linux サーバーの時刻同期を記録しますdate : 現在時刻を表示すると、結果は次のようになります。火曜日 3 月 4 01:36:45 CST 2017
date -s 09:38:40 : 現在の時刻を設定します。結果は次のようになります: 火曜日 3 月 4 09:38:40 CST 2017
ntpdate コマンド:ntpdate -u ntp.api.bz :ネットワーク時刻同期コマンド
ntp よく使用されるサーバー:中国国家時刻サービスセンター: 210.72.145.44
NTP サーバー (上海): ntp.api.bz
以上がSpringboot2のセッションタイムアウト設定が無効になる問題の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。