首頁 >Java >java教程 >Springboot2 session設定超時時間無效怎麼解決

Springboot2 session設定超時時間無效怎麼解決

PHPz
PHPz轉載
2023-05-22 13:49:503078瀏覽

問題:

今天專案中遇到了一個設定時間逾時的問題,按SpringBoot2的application.properties變更一直不生效。

解決方案:

  • Spring Boot使用的內嵌容器受server.*屬性的控制。 Spring Boot將使用ServletWebServerFactory實例之一來建立servlet容器的執行個體。這些類別利用 ​​server.* 屬性來設定受管制的 Servlet 容器(例如 Tomcat、Jetty 等)。

  • 當應用程式打包成war檔部署到Tomcat實例時,就不能使用 server.* 屬性。這些不適用,因為可以利用預設的servlet容器(因為服務是在遠端運行的)。因此,部署到遠端Tomcat將使server.*屬性無用。

1. 依照網路給的貼文更改設定檔(如果是Jar啟動生效) ,如下:

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

說明:PT1H 意思是設定session失效的時間是1小時。

擴充功能:Duration

透過查看springboot原始碼發現setTimeouot方法,這裡要求傳入Duration的實例

public void setTimeout(Duration timeout) {
       this.timeout = timeout;
    }

Duration是在Java8中新增的,主要用來計算日期差值,Duration是被final聲明的,而且是線程安全的。

如果轉換字串方式,類似於SimpleDateFormat 的格式化日期方式

Duration 字串類似數字有正負之分:預設為正,負以'-'開頭,下面緊接著'PT', 下面時間字母:

  • 'D' – 天

  • 'H' – 小時

  • 'M' – 分鐘

  • 'S' – 秒

#每個單位都必須由數字開始,且時分秒順序不能亂,例如:PT2H3M2S 等於-PT-2H-3M-2S。

2. 設定tomcat的session逾時

1)在tomcat的conf目錄下,更改servler.xml:

<Context path="/abtest" docBase="/abtest"  
  defaultSessionTimeOut="3600" isWARExpanded="true"  
  isWARValidated="false" isInvokerEnabled="true"  
  isWorkDirPersistent="false"/>

2) 專案中更改web.xml:

<session-config>  
    <session-timeout>20</session-timeout>  
</session-config>

3)在程式中更改

session.setMaxInactiveInterval(30*60);

當你遇到同樣的問題時,請先看上面的紅字,按順序排查即可。

測試程式碼:

@RestController
@RequestMapping("/valid-time")
public class TestController { 
    @GetMapping("/test")
    public String validTime(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(); 
        int sessionTime = session.getMaxInactiveInterval(); 
        return new StringBuilder("sessionTime=").append(sessionTime).toString();
    }
}

時間不同步導致Spring session失效的巨坑

Linux伺服器時間不同步導致Spring session失效的巨坑

由於業務的需要,將原本單機環境轉為叢集式環境,為了不修改任務所以選擇了spring session redis作為session共享方案。

確認技術方案之後就在網路上巴拉巴拉的搜尋一堆關於spring session的資料,看了一遍沒有發現前人有任何躺坑後,開始著手。

安裝redis過程忽略。

根據資料一步一步的將spring session加入工程,單節點情況項目成功跑起來,沒有報錯,session也成功的寫入了redis。

然後為了穩妥起見,又在自己電腦上安裝了nginx,並部署了3個tomcat,一切看起來都那麼完美,多個節點之間完成了session共享。

到目前已經完成了所有前期準備,就差最後一步了。

惡夢開始了…

在線上將所有節點部署完成,然後打開瀏覽器順利訪問到應用,當然我們不能只停留在看到頁面完事的地步,怎麼也要登入登入吧,於是…

然後…

無數次的輸入使用者密碼,提示登入成功,最終的結果還是被拒之門外,o(╥﹏╥)o

接下來就是無數的填坑之旅

看日誌…

看各種請求請求…

懷疑spring session有BUG… …

甚至開啟了遠端DEBUG模式調試,終於在萬能的DEBUG模式下看到,spring session的getSession的時候,如果獲取到了session,首先會判斷此session有沒有過期,比較的方式也很簡單,就是取得目前系統時間去和session的過期時間進行比較,如果目前時間小於過期時間,則標識此session沒有過期。 看到這裡,瞬間有了一股醍醐灌頂之感,小宇宙終於在這裡爆發了。

尼瑪—>取得的session全部是過期的,然後…然後…當然是趕緊跑去看伺服器時間,於是…哭了o(╥﹏╥)o,原來尼瑪是你坑了我…

為了紀念這次躺坑之旅,特發此文

#另外順便記錄Linux伺服器時間同步

#date指令:

date :查看目前時間,結果如下:Tue Mar 4 01:36:45 CST 2017

date -s 09:38:40 :設定目前時間,結果如下:Tue Mar 4 09:38:40 CST 2017

ntpdate指令:

ntpdate -u ntp.api.bz :網路時間同步指令

ntp常用伺服器:

中國國家授時中心:210.72.145.44

NTP伺服器(上海) :ntp.api.bz

以上是Springboot2 session設定超時時間無效怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除