JWT 設置token過期時間無效的解決
JWT 設置token過期時間無效
原因
設置超時時間的順序有誤, 應調用setClaims()方法設置claims屬性。
在調用setExpiration()方法設置超時時間。
Date expiresDate = new Date(System.currentTimeMillis() + expire_time);// expire_time為token有效時長, 單位毫秒
錯誤順序示例:
JwtBuilder result = Jwts.builder() ? ? ? ? ? ? ? ? .setExpiration(date) // 超時時間設置在 setClaims之前 ?? ??? ?.setClaims(claims)? ?? ??? ?.signWith(SignatureAlgorithm.HS256, Constants.BASE64SECRET);
正確順序示例:
JwtBuilder result = Jwts.builder() ?? ??? ?.setClaims(claims) // 先調用setClaims, 在調用setExpiration ?? ??? ?.setExpiration(date) ?? ??? ?.signWith(SignatureAlgorithm.HS256, Constants.BASE64SECRET);
原因分析
//io.jsonwebtoken.impl.DefaultJwtBuilder#setExpiration 中代碼 @Override public JwtBuilder setExpiration(Date exp) { if (exp != null) { // 設置的時間不為空,就調用ensureClaims方法 ensureClaims().setExpiration(exp); } else { if (this.claims != null) { //noinspection ConstantConditions this.claims.setExpiration(exp); } } return this; } // io.jsonwebtoken.impl.DefaultJwtBuilder#ensureClaims 中代碼 protected Claims ensureClaims() { // 如果claims為null, 則創(chuàng)建新的示例。 此處沒有問題 if (this.claims == null) { this.claims = new DefaultClaims(); } return this.claims; } // io.jsonwebtoken.impl.DefaultJwtBuilder#setClaims(io.jsonwebtoken.Claims) 中代碼 @Override public JwtBuilder setClaims(Claims claims) { // 直接給claims賦值, 這里個操作覆蓋了之前設置的超時時間, // 導致最終構造token時, 沒有設置超時時間 this.claims = claims; return this; }
JWT token過期自動續(xù)期解決方案
JWT
JWT全稱JSON Web Token,由三部分組成header(頭部,用于描述關于該JWT的最基本的信息,例如其類型以及簽名所用的算法等)、payload(載荷,就是存放有效信息的地方,在這一部分中存放過期時間)和signature(簽證,簽證信息)。
token
token就是后端生成的JWT字符串值,在前后端分離中,token是前端訪問后端接口的合法身份、權限的憑證。
token過期刷新方案
1、單點登錄
用戶登錄,后端驗證用戶成功之后生成兩個token,這兩個token分別是access_token(訪問接口使用的token)、refresh_token(access_token過期后用于刷續(xù)期的token,注意設置refresh_token的過期時間需比access_token的過期時間長),后端將用戶信息和這兩個token存放到redis中并返回給前端。
前端在獲取到登錄成功返回的兩個token之后,將之存放到localStorage本地存儲中。
2、接口請求
前端封裝統(tǒng)一接口請求函數(shù)、token刷新函數(shù),在請求成功之后對返回結果進行校驗,如果token過期,則調用token刷新函數(shù)請求新的token.
后端在接收到token刷新請求之后通過結合redis中存放的用戶信息、token和refresh_token對請求參數(shù)進行驗證,驗證通過之后生成新的token和refresh_token存放到redis中并返回給前端。至此完成token刷新。
3、多請求應對
所謂多請求,就是指在短時間內同時發(fā)生多個請求,如果此時token已經(jīng)過期,那么這些請求都會出現(xiàn)token過期請求失敗的情況。
為了避免反復刷新token,需要設置一個刷新token的開關isRefresh,當一個請求出現(xiàn)token過期的時候,這個時候會調用token刷新函數(shù),與此同時關閉開關將isRefresh的值設置為false,避免后續(xù)請求去調用token刷新函數(shù)。
當發(fā)現(xiàn)token過期時,咱們將請求延緩到token刷新之后再重新執(zhí)行請求,這里采用Promise函數(shù),把每一個token失效的請求都存到一個Promise函數(shù)集合里面,當token刷新之后打開開關將isRefresh的值設置為true,然后批量執(zhí)行Promise函數(shù)集合里面的Promise函數(shù),返回請求結果。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java 圖文并茂講解主方法中的String[] args參數(shù)作用
很多老鐵不清楚JAVA主方法中main()里面的的參數(shù)是什么意思,以及有什么作用,接下來給大家用最通俗易懂的話來講解,還不清楚的朋友來看看吧2022-04-04mybatisPlus實現(xiàn)邏輯刪除,自動生成創(chuàng)建時間和更新時間方式
MyBatisPlus框架中,通過@TableField(fill=FieldFill.INSERT)和@TableField(fill=FieldFill.UPDATE)注解可以實現(xiàn)在插入和更新時自動填充字段,比如創(chuàng)建時間和更新時間,使用@TableLogic注解標識邏輯刪除字段2024-09-09Java數(shù)據(jù)結構實現(xiàn)折半查找的算法過程解析
這篇文章主要介紹了Java數(shù)據(jù)結構實現(xiàn)折半查找的算法過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03