Springboot2 session設(shè)置超時時間無效的解決
問題:
今天項目中遇到了一個設(shè)置時間超時的問題,按SpringBoot2的application.properties更改一直不生效。
解決方案:
- server.*屬性用于控制Spring Boot使用的嵌入式容器 。 Spring Boot將使用ServletWebServerFactory實例之一創(chuàng)建servlet容器的實例。 這些類使用server.*屬性來配置受控的servlet容器(tomcat,jetty等)。
- 當(dāng)應(yīng)用程序作為war文件部署到Tomcat實例時, server.*屬性不適用。 它們不適用,因為可以使用預(yù)先配置的servlet容器(因為它是遠(yuǎn)程運行的服務(wù))。 因此,部署到遠(yuǎn)程Tomcat將使server.*屬性無用。
1. 按照網(wǎng)上給的帖子更改配置文件(如果是Jar啟動生效) ,如下:
server:
servlet:
session:
timeout: PT1H # 1小時過期
cookie:
max-age: PT1H # 1小時過期說明:PT1H 意思是設(shè)置session失效的時間是1小時。
擴(kuò)展:Duration
通過查看springboot源碼發(fā)現(xiàn)setTimeouot方法,這里要求傳入Duration的實例
public void setTimeout(Duration timeout) {
this.timeout = timeout;
}Duration是在Java8中新增的,主要用來計算日期差值,Duration是被final聲明的,并且是線程安全的。
如果轉(zhuǎn)換字符串方式,類似于 SimpleDateFormat 的格式化日期方式
Duration 字符串類似數(shù)字有正負(fù)之分:默認(rèn)為正,負(fù)以'-'開頭,下面緊接著'PT', 下面時間字母:
- 'D' – 天
- 'H' – 小時
- 'M' – 分鐘
- 'S' – 秒
每個單位都必須由數(shù)字開始,且時分秒順序不能亂,比如:PT2H3M2S 等于 -PT-2H-3M-2S。
2. 設(shè)置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);
當(dāng)你遇到同樣的問題時,請先看上面的紅字,按順序排查即可。
測試代碼:
@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();
}
}時間不同步導(dǎo)致Spring session失效的巨坑
Linux服務(wù)器時間不同步導(dǎo)致Spring session失效的巨坑
由于業(yè)務(wù)的需要,將原本單機(jī)環(huán)境轉(zhuǎn)為集群式環(huán)境,為了不修改任務(wù)所以選擇了spring session + redis作為session共享方案。
確認(rèn)技術(shù)方案之后就在網(wǎng)上巴拉巴拉的搜索一堆關(guān)于spring session的資料,看了一遍沒有發(fā)現(xiàn)前人有任何躺坑后,開始著手。
安裝redis過程忽略。
根據(jù)資料一步一步的將spring session加入工程,單節(jié)點情況項目成功跑起來,沒有報錯,session也成功的寫入了redis。
然后為了穩(wěn)妥起見,又在自己電腦上安裝了nginx,并部署了3個tomcat,一切看起來都那么完美,多個節(jié)點之間完成了session共享。
到目前已經(jīng)完成了所有前期準(zhǔn)備,就差最后一步了。
噩夢開始了……
在線上將所有節(jié)點部署完成,然后打開瀏覽器順利訪問到應(yīng)用,當(dāng)然我們不能僅僅停留在看到頁面完事的地步,怎么也要登錄登錄吧,于是……
然后……
無數(shù)次的輸入用戶密碼,提示登錄成功,最終的結(jié)果還是被拒之門外,o(╥﹏╥)o
接下來就是無數(shù)的填坑之旅
看日志……
看各種請求請求……
懷疑spring session有BUG……
甚至開啟了遠(yuǎn)程DEBUG模式調(diào)試,終于在萬能的DEBUG模式下看到,spring session的getSession的時候,如果獲取到了session,首先會判斷此session有沒有過期,比較的方式也很簡單,就是獲取當(dāng)前系統(tǒng)時間去和session的過期時間進(jìn)行比較,如果當(dāng)前時間小于過期時間,則標(biāo)識此session沒有過期。看到這里,瞬間有了一股醍醐灌頂之感,小宇宙終于在這里爆發(fā)了。
—>獲取的session全部是過期的,然后……然后……當(dāng)然是趕緊跑去看服務(wù)器時間,于是……哭了o(╥﹏╥)o,原來是你坑了我……
為了紀(jì)念這次躺坑之旅,特發(fā)此文
另外順便記錄一下Linux服務(wù)器時間同步
date命令:
date :查看當(dāng)前時間,結(jié)果如下:Tue Mar 4 01:36:45 CST 2017
date -s 09:38:40 :設(shè)置當(dāng)前時間,結(jié)果如下:Tue Mar 4 09:38:40 CST 2017
ntpdate命令:
ntpdate -u ntp.api.bz :網(wǎng)絡(luò)時間同步命令
ntp常用服務(wù)器:
中國國家授時中心:210.72.145.44
NTP服務(wù)器(上海) :ntp.api.bz
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Spring實現(xiàn)零重啟自由編排任務(wù)的定時管理器
我們發(fā)現(xiàn),我們使用Spring自帶的定時任務(wù)如果要有修改,那么就要修改代碼,然后重啟項目,所以本文就帶大家實現(xiàn)一個零重啟自由編排任務(wù)的定時管理器吧2023-07-07
MAC上IntelliJ IDEA的svn無法保存密碼解決方案
今天小編就為大家分享一篇關(guān)于MAC上IntelliJ IDEA的svn無法保存密碼解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
基于spring cloud多個消費端重復(fù)定義feign client的問題
這篇文章主要介紹了spring cloud多個消費端重復(fù)定義feign client的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java線程的創(chuàng)建介紹及實現(xiàn)方式示例
這篇文章主要為大家介紹了Java線程的創(chuàng)建介紹及實現(xiàn)方式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
你知道在Java中Integer和int的這些區(qū)別嗎?
最近面試,突然被問道,說一下Integer和int的區(qū)別.額…可能平時就知道寫一些業(yè)務(wù)代碼,包括面試的一些Spring源碼等,對于這種特別基礎(chǔ)的反而忽略了,導(dǎo)致面試的時候突然被問到反而不知道怎么回答了.哎,還是乖乖再看看底層基礎(chǔ),順帶記錄一下把 ,需要的朋友可以參考下2021-06-06
Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案
這篇文章主要為大家介紹了Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
幾句話說清session,cookie和token的區(qū)別及說明
這篇文章主要介紹了幾句話說清session,cookie和token的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

