前言
記錄一下前後端分離下————token超時重新整理策略!
需求場景
昨天發了一篇記錄 前後端分離應用——使用者資訊傳遞 中介紹了token
認證機制,跟幾位群友討論了下,有些同學有這麼一個疑惑:token
失效了,應該怎麼做?強制定向到登入頁?
其實理論上如果是活躍使用者,token
失效後,假如使用者正在操作表單,此時突然定向到登入頁面,那使用者體驗太差了。
實現目標
- 延長
token
過期時間 - 活躍使用者在
token
過期時,在使用者無感知的情況下動態重新整理token
,做到一直線上狀態 - 不活躍使用者在
token
過期時,直接定向到登入頁
登入返回欄位
如何簽發token
,請看上一篇推文,這裡不做過多介紹。先看看登入介面返回的資料如下:
@Data
public class LoginVo implements Serializable {
private static final long serialVersionUID = 6711396581310450023L;
//...省略部分業務欄位
/**
* token令牌 過期時間預設15day
*/
private String jwt;
/**
* 重新整理token 過期時間可以設定為jwt的兩倍,甚至更長,用於動態重新整理token
*/
private String refreshJwt;
/**
* token過期時間戳
*/
private Long tokenPeriodTime;
}
複製程式碼
具體返回欄位的意義請看註釋,這裡再簡要說明:
- jwt:使用者正常訪問介面時提交的
token
,過期時間設定長一些,15day吧 - refreshJwt:重新整理
token
過期時間可以設定為jwt
的兩倍,甚至更長,用於動態重新整理token
時候提交後臺驗證 - tokenPeriodTime:
token
過期時間戳,前端每次呼叫介面前需要主動判斷是否已經過期,如果過期則提交refreshJwt
訪問token
重新整理的介面進行重新整理
動態重新整理token
前端檢測到token
過期後,攜帶refreshJwt
訪問後臺重新整理token
的介面,服務端在攔截器中依然對refreshJwt
進行解析鑑權
- 假如
refreshJwt
也過期了,提示登入過期,強制跳轉登入頁 - 假如
refreshJwt
還在有效期,則簽發新的token
返回,前端使用最新的token
進行介面請求
總結
- 如果是活躍使用者,那麼允許他在
refreshJwt
過期時間與token
過期時間的差值這段時間內,不停的動態重新整理token
,使其做到無感知的狀態下一直保持登入狀態 - 如果使用者不活躍,在
refreshJwt
過期時間到了,依然沒有使用系統,那麼將判定為不活躍使用者,此時應當重定向到登入頁了
最後
篇幅較短,主要是延續上一篇 前後端分離應用——使用者資訊傳遞 遺留問題做一下總結。如果你有更好的做法,歡迎留言告知我,謝謝啦。後續會不定期更新原創文章,歡迎關注公眾號 「張少林同學」!