SpringBoot?jwt的token如何刷新
1、為什么要刷新Token的過期時間?
Token
都有過期時間。那么問題來了,假設(shè)Token
過期時間為15天,用戶在第14天的時候,還可以免登錄正常訪問系統(tǒng)。但是到了第15天,用戶的Token過期,于是用戶需要重新登錄系統(tǒng)。
HttpSession
的過期時間比較優(yōu)雅,默認(rèn)為15分鐘。如果用戶連續(xù)使用系統(tǒng),只要間隔時間不超過15分鐘,系統(tǒng)就不會銷毀HttpSession
對象。JWT的令牌過期時間能不能做成HttpSession
那樣超時時間,只要用戶間隔操作時間不超過15天,系統(tǒng)就不需要用戶重新登錄系統(tǒng)。實(shí)現(xiàn)這種效果的方案有兩種:雙Token
和Token緩存
,這里重點(diǎn)講一下Token
緩存方案。
Token緩存方案是把Token
緩存到Redis,然后設(shè)置Redis里面緩存的Token
過期時間為正常Token
的1倍,然后根據(jù)情況刷新Token
的過期時間。
1、Token失效,緩存也不存在的情況
當(dāng)?shù)?5天,用戶的Token
失效以后,我們讓Shiro程序到Redis查看是否存在緩存的Token
,如果這個Token
不存在于Redis里面,就說明用戶的操作間隔了15天,需要重新登錄。
2、Token失效,但是緩存還存在的情況
如果Redis中存在緩存的Token
,說明當(dāng)前Token
失效后,間隔時間還沒有超過15天,不應(yīng)該讓用戶重新登錄。所以要生成新的Token
返回給客戶端,并且把這個Token
緩存到Redis里面,這種操作成為刷新Token
過期時間。
2、客戶端如何更新令牌?
在我們的方案中,服務(wù)端刷新Token
過期時間,其實(shí)就是生成一個新的Token
給客戶端。那么客戶端怎么知道這次響應(yīng)帶回來的Token是更新過的呢?這個問題很容易解決。
只要用戶成功登陸系統(tǒng),當(dāng)后端服務(wù)器更新Token
的時候,就在響應(yīng)中添加Token
。客戶端那邊判斷每次Ajax響應(yīng)里面是否包含Token
,如果包含,就把Token
保存起來就可以了。
3、如何在響應(yīng)中添加令牌?
我們定義OAuth2Filter
類攔截所有的HTTP請求,一方面它會把請求中的Token
字符串提取出來,封裝成對象交給Shiro框架;另一方面,它會檢查Token
的有效性。如果Token
過期,那么會生成新的Token
,分別存儲在ThreadLocalToken
和Redis
中。
之所以要把新令牌保存到ThreadLocalToken
里面,是因?yàn)橐?code>AOP切面類傳遞這個新令牌。雖然OAuth2Filter
中有doFilterInternal()
方法,我們可以得到響應(yīng)并且寫入新令牌。但是這個做非常麻煩,首先我們要通過IO流讀取響應(yīng)中的數(shù)據(jù),然后還要把數(shù)據(jù)解析成JSON對象,最后再放入這個新令牌。如果我們定義了AOP切面類
,攔截所有Web方法返回的R對象
,然后在R對象
里面添加新令牌,這多簡單啊。但是OAuth2Filter
和AOP
切面類之間沒有調(diào)用關(guān)系,所以我們很難把新令牌傳給AOP切面類
。
這里我想到了ThreadLocal
,只要是同一個線程,往ThreadLocal
里面寫入數(shù)據(jù)和讀取數(shù)據(jù)是完全相同的。在Web項(xiàng)目中,從OAuth2Filter
到AOP切面類
,都是由同一個線程來執(zhí)行的,中途不會更換線程。所以我們可以放心的把新令牌保存都在ThreadLocal
里面,AOP切面類
可以成功的取出新令牌,然后往R對象
里面添加新令牌即可。
ThreadLocalToken
是我自定義的類,里面包含了ThreadLocal
類型的變量,可以用來保存線程安全的數(shù)據(jù),而且避免了使用線程鎖。
總結(jié)
到此這篇關(guān)于SpringBoot jwt的token如何刷新的文章就介紹到這了,更多相關(guān)jwt的token刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案
統(tǒng)?的數(shù)據(jù)返回格式使? @ControllerAdvice 和 ResponseBodyAdvice 的?式實(shí)現(xiàn),下面給大家分享Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案,感興趣的朋友一起看看吧2024-03-03IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽
這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Java中try-catch的使用及注意細(xì)節(jié)
現(xiàn)在有很多的語言都支持try-catch,比如常見的就是c++,java等,這篇文章主要給大家介紹了關(guān)于Java中try-catch的使用及注意細(xì)節(jié)的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Spring Security結(jié)合JWT的方法教程
這篇文章主要給大家介紹了關(guān)于Spring Security結(jié)合JWT的方法教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單
這篇文章主要介紹了Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解
這篇文章主要介紹了SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解,在創(chuàng)建代理的時候?qū)δ繕?biāo)類的每個連接點(diǎn)使用靜態(tài)切點(diǎn)檢查,如果僅通過靜態(tài)切點(diǎn)檢查就可以知道連接點(diǎn)是不匹配的,則在運(yùn)行時就不再進(jìn)行動態(tài)檢查了,需要的朋友可以參考下2023-09-09