Springboot2 session設定超時時間無效怎麼解決
問題:
今天專案中遇到了一個設定時間逾時的問題,按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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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