您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Springboot2 session設(shè)置超時(shí)時(shí)間無(wú)效的解決方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
今天項(xiàng)目中遇到了一個(gè)設(shè)置時(shí)間超時(shí)的問(wèn)題,按SpringBoot2的application.properties更改一直不生效。
server.*屬性用于控制Spring Boot使用的嵌入式容器 。 Spring Boot將使用ServletWebServerFactory實(shí)例之一創(chuàng)建servlet容器的實(shí)例。 這些類使用server.*屬性來(lái)配置受控的servlet容器(tomcat,jetty等)。
當(dāng)應(yīng)用程序作為war文件部署到Tomcat實(shí)例時(shí), server.*屬性不適用。 它們不適用,因?yàn)榭梢允褂妙A(yù)先配置的servlet容器(因?yàn)樗沁h(yuǎn)程運(yùn)行的服務(wù))。 因此,部署到遠(yuǎn)程Tomcat將使server.*屬性無(wú)用。
server: servlet: session: timeout: PT1H # 1小時(shí)過(guò)期 cookie: max-age: PT1H # 1小時(shí)過(guò)期
說(shuō)明:PT1H 意思是設(shè)置session失效的時(shí)間是1小時(shí)。
擴(kuò)展:Duration
通過(guò)查看springboot源碼發(fā)現(xiàn)setTimeouot方法,這里要求傳入Duration的實(shí)例
public void setTimeout(Duration timeout) { this.timeout = timeout; }
Duration是在Java8中新增的,主要用來(lái)計(jì)算日期差值,Duration是被final聲明的,并且是線程安全的。
如果轉(zhuǎn)換字符串方式,類似于 SimpleDateFormat 的格式化日期方式
Duration 字符串類似數(shù)字有正負(fù)之分:默認(rèn)為正,負(fù)以'-'開(kāi)頭,下面緊接著'PT', 下面時(shí)間字母:
'D' – 天
'H' – 小時(shí)
'M' – 分鐘
'S' – 秒
每個(gè)單位都必須由數(shù)字開(kāi)始,且時(shí)分秒順序不能亂,比如:PT2H3M2S 等于 -PT-2H-3M-2S。
1)在tomcat的conf目錄下,更改servler.xml:
<Context path="/abtest" docBase="/abtest" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
2) 項(xiàng)目中更改web.xml:
<session-config> <session-timeout>20</session-timeout> </session-config>
3)在程序中更改
session.setMaxInactiveInterval(30*60);
當(dāng)你遇到同樣的問(wèn)題時(shí),請(qǐng)先看上面的紅字,按順序排查即可。
測(cè)試代碼:
@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(); } }
Linux服務(wù)器時(shí)間不同步導(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的資料,看了一遍沒(méi)有發(fā)現(xiàn)前人有任何躺坑后,開(kāi)始著手。
安裝redis過(guò)程忽略。
根據(jù)資料一步一步的將spring session加入工程,單節(jié)點(diǎn)情況項(xiàng)目成功跑起來(lái),沒(méi)有報(bào)錯(cuò),session也成功的寫(xiě)入了redis。
然后為了穩(wěn)妥起見(jiàn),又在自己電腦上安裝了nginx,并部署了3個(gè)tomcat,一切看起來(lái)都那么完美,多個(gè)節(jié)點(diǎn)之間完成了session共享。
到目前已經(jīng)完成了所有前期準(zhǔn)備,就差最后一步了。
噩夢(mèng)開(kāi)始了……
在線上將所有節(jié)點(diǎn)部署完成,然后打開(kāi)瀏覽器順利訪問(wèn)到應(yīng)用,當(dāng)然我們不能僅僅停留在看到頁(yè)面完事的地步,怎么也要登錄登錄吧,于是……
然后……
無(wú)數(shù)次的輸入用戶密碼,提示登錄成功,最終的結(jié)果還是被拒之門(mén)外,o(╥﹏╥)o
接下來(lái)就是無(wú)數(shù)的填坑之旅
看日志……
看各種請(qǐng)求請(qǐng)求……
懷疑spring session有BUG……
甚至開(kāi)啟了遠(yuǎn)程DEBUG模式調(diào)試,終于在萬(wàn)能的DEBUG模式下看到,spring session的getSession的時(shí)候,如果獲取到了session,首先會(huì)判斷此session有沒(méi)有過(guò)期,比較的方式也很簡(jiǎn)單,就是獲取當(dāng)前系統(tǒng)時(shí)間去和session的過(guò)期時(shí)間進(jìn)行比較,如果當(dāng)前時(shí)間小于過(guò)期時(shí)間,則標(biāo)識(shí)此session沒(méi)有過(guò)期。看到這里,瞬間有了一股醍醐灌頂之感,小宇宙終于在這里爆發(fā)了。
尼瑪—>獲取的session全部是過(guò)期的,然后……然后……當(dāng)然是趕緊跑去看服務(wù)器時(shí)間,于是……哭了o(╥﹏╥)o,原來(lái)尼瑪是你坑了我……
為了紀(jì)念這次躺坑之旅,特發(fā)此文
date命令:
date :查看當(dāng)前時(shí)間,結(jié)果如下:Tue Mar 4 01:36:45 CST 2017
date -s 09:38:40 :設(shè)置當(dāng)前時(shí)間,結(jié)果如下:Tue Mar 4 09:38:40 CST 2017
ntpdate命令:
ntpdate -u ntp.api.bz :網(wǎng)絡(luò)時(shí)間同步命令
ntp常用服務(wù)器:
中國(guó)國(guó)家授時(shí)中心:210.72.145.44
NTP服務(wù)器(上海) :ntp.api.bz
“Springboot2 session設(shè)置超時(shí)時(shí)間無(wú)效的解決方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。