目錄
問題:
解決方案:
1. 依照網路給的貼文更改設定檔(如果是Jar啟動生效) ,如下:
2. 設定tomcat的session逾時
時間不同步導致Spring session失效的巨坑
#另外順便記錄Linux伺服器時間同步
首頁 Java java教程 Springboot2 session設定超時時間無效怎麼解決

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

May 22, 2023 pm 01:49 PM
session springboot

問題:

今天專案中遇到了一個設定時間逾時的問題,按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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
怎麼在SpringBoot中使用Redis實現分散式鎖 怎麼在SpringBoot中使用Redis實現分散式鎖 Jun 03, 2023 am 08:16 AM

一、Redis實現分散式鎖原理為什麼需要分散式鎖在聊分散式鎖之前,有必要先解釋一下,為什麼需要分散式鎖。與分散式鎖相對就的是單機鎖,我們在寫多執行緒程式時,避免同時操作一個共享變數產生資料問題,通常會使用一把鎖來互斥以保證共享變數的正確性,其使用範圍是在同一個進程中。如果換做是多個進程,需要同時操作一個共享資源,如何互斥?現在的業務應用通常是微服務架構,這也意味著一個應用會部署多個進程,多個進程如果需要修改MySQL中的同一行記錄,為了避免操作亂序導致髒數據,此時就需要引入分佈式鎖了。想要實現分

springboot讀取檔案打成jar包後存取不到怎麼解決 springboot讀取檔案打成jar包後存取不到怎麼解決 Jun 03, 2023 pm 04:38 PM

springboot讀取文件,打成jar包後訪問不到最新開發出現一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,只能通過流去讀取。文件在resources下publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

session失效怎麼解決 session失效怎麼解決 Oct 18, 2023 pm 05:19 PM

session失效通常是由於 session 的生存時間過期或伺服器關閉導致的。其解決方法:1、延長session的生存時間;2、使用持久化儲存;3、使用cookie;4、非同步更新session;5、使用會話管理中介軟體。

SpringBoot怎麼自訂Redis實作快取序列化 SpringBoot怎麼自訂Redis實作快取序列化 Jun 03, 2023 am 11:32 AM

1.自訂RedisTemplate1.1、RedisAPI預設序列化機制基於API的Redis快取實作是使用RedisTemplate範本進行資料快取操作的,這裡開啟RedisTemplate類,查看該類別的源碼資訊publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations,BeanClassLoaderAware{//聲明了value的各種序列化方式,初始值為空@NullableprivateRedisSe

SpringBoot與SpringMVC的比較及差別分析 SpringBoot與SpringMVC的比較及差別分析 Dec 29, 2023 am 11:02 AM

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

PHP Session 跨域問題的解決方法 PHP Session 跨域問題的解決方法 Oct 12, 2023 pm 03:00 PM

PHPSession跨域問題的解決方法在前後端分離的開發中,跨域請求已成為常態。在處理跨域問題時,我們通常會涉及session的使用和管理。然而,由於瀏覽器的同源策略限制,跨域情況下預設無法共享session。為了解決這個問題,我們需要採用一些技巧和方法來實現session的跨域共享。一、使用cookie跨域共享session最常

Redis的分享session應用如何實現簡訊登入 Redis的分享session應用如何實現簡訊登入 Jun 03, 2023 pm 03:11 PM

1.基於session實作簡訊登入1.1簡訊登入流程圖1.2實作發送簡訊驗證碼前端請求說明:說明請求方式POST請求路徑/user/code請求參數phone(電話號碼)回傳值無後端介面實作:@Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1.校驗手機號碼if

JavaScript和PHP的cookie之間有哪些差異? JavaScript和PHP的cookie之間有哪些差異? Sep 02, 2023 pm 12:29 PM

JavaScriptCookie使用JavaScriptcookie是記住和追蹤偏好、購買、佣金和其他資訊的最有效方法。更好的訪客體驗或網站統計所需的資訊。 PHPCookieCookie是儲存在客戶端電腦上的文字檔案並保留它們用於追蹤目的。 PHP透明地支援HTTPcookie。 JavaScriptcookie如何運作?您的伺服器將一些資料傳送到訪客的瀏覽器cookie的形式。瀏覽器可以接受cookie。如果存在,它將作為純文字記錄儲存在訪客的硬碟上。現在,當訪客到達網站上的另一個頁面時

See all articles