ホームページ  >  記事  >  Java  >  Springboot2のセッションタイムアウト設定が無効になる問題の解決方法

Springboot2のセッションタイムアウト設定が無効になる問題の解決方法

PHPz
PHPz転載
2023-05-22 13:49:502992ブラウズ

問題:

今日、プロジェクトで設定タイムアウトの問題が発生し、SpringBoot2 の application.properties の変更が反映されませんでした。

解決策:

  • Spring Boot によって使用される組み込みコンテナーは、server.* プロパティによって制御されます。 Spring Boot は、ServletWebServerFactory インスタンスの 1 つを使用してサーブレット コンテナのインスタンスを作成します。これらのクラスは、server.* 属性を使用して、管理対象サーブレット コンテナ (Tomcat、Jetty など) を構成します。

  • アプリケーションが war ファイルにパッケージ化され、Tomcat インスタンスにデプロイされる場合、server.* 属性は使用できません。事前に作成されたサーブレット コンテナを利用できるため、これらは適用されません (サービスがリモートで実行されているため)。したがって、リモート Tomcat にデプロイすると、server.* プロパティが役に立たなくなります。

1. インターネット上の投稿に従って設定ファイルを次のように変更します (Jar で起動した場合に有効になります)。 : PT1H は、セッションの有効期限を設定する時間が 1 時間であることを意味します。

Extension:Duration

スプリングブート ソース コードを表示すると、setTimeouot メソッドが見つかります。ここでは、Duration のインスタンスを渡す必要があります。

server:
  servlet:
    session:
      timeout: PT1H        # 1小时过期
      cookie:
        max-age: PT1H      # 1小时过期

Duration は新しいですJava8 では、主に日付の差分、期間の計算に使用され、最終的に宣言され、スレッドセーフです。

文字列を変換する場合、それは SimpleDateFormat

Duration の日付書式設定メソッドに似ています。文字列は、正と負の数値に似ています。デフォルトは正で、負の値から始まります。 「-」の後に「PT」、次の時間文字が続きます:

    'D' - day
  • 'H' -時
  • 'M' - 分
  • 'S' - 秒
  • 各ユニットは次のことを行う必要があります。数字で始まり、時と分で始まります。秒の順序を間違えることはできません。たとえば、PT2H3M2S は -PT-2H-3M-2S と同じです。

2. tomcat のセッション タイムアウトを設定します

1) tomcat の conf ディレクトリで、servler.xml を変更します:

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 コマンド:

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。