Token過期實現(xiàn)自動續(xù)期的方法步驟
相信小伙伴對Token再熟悉不過了,token主要有兩個作用:
一、Token的作用
1.防止表單重復(fù)提交
防止表單重復(fù)提交一般還是使用前后端都限制的方式。比如:在前端點擊提交之后,將按鈕置為灰色,不可再次點擊,然后客戶端和服務(wù)端的token各自獨立存儲,客戶端存儲在Cookie或者Form的隱藏域中,服務(wù)端存儲在Session或者其他緩存系統(tǒng)中。
2.用來作身份驗證(流程)
① 客戶端使用用戶名跟密碼請求登錄;
②通過ajax向后端發(fā)送請求;
③服務(wù)端收到請求,去驗證用戶名與密碼;
④驗證成功后,服務(wù)端會簽發(fā)一個 Token,再把這個 Token 發(fā)送給客戶端;
⑤客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里;
⑥客戶端每次向服務(wù)端請求資源的時候需要帶著服務(wù)端簽發(fā)的 Toke(不管是你自己寫的)它都要通過ajax向后端發(fā)送請求,這時服務(wù)端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)。
二、Token過期
Token過期通常意味著身份驗證的憑證已經(jīng)達(dá)到其設(shè)定的有效期,需要用戶重新進(jìn)行身份驗證或使用刷新Token來獲取新的訪問Token。
這種情況通常發(fā)生在以下幾種情境中:
- 安全性:為了防止Token被長期使用,設(shè)置過期時間可以減少因Token被竊取或泄露而帶來的安全風(fēng)險。
- 數(shù)據(jù)一致性:Token的過期可以幫助確保服務(wù)器上的用戶數(shù)據(jù)與Token中攜帶的數(shù)據(jù)保持一致,避免因Token長期有效而導(dǎo)致的數(shù)據(jù)不同步問題。
- 性能優(yōu)化:長時間有效的Token會增加網(wǎng)絡(luò)傳輸?shù)拈_銷和服務(wù)器的處理負(fù)擔(dān),通過設(shè)置過期時間,可以優(yōu)化系統(tǒng)性能。
處理Token過期的方法包括:
- 重新獲取授權(quán)碼:用戶需要與授權(quán)服務(wù)器交互以獲取新的訪問Token和(如果適用)刷新Token。
- 使用刷新Token:如果應(yīng)用程序使用了刷新Token,可以通過它來請求新的訪問Token,從而避免用戶重新登錄。
- 黑名單機制:通過維護(hù)一個黑名單,將無效的Token列入其中,以確保只有有效的Token才能被接受。
JWT token的 payload 部分是一個json串,是要傳遞數(shù)據(jù)的一組聲明,這些聲明被JWT標(biāo)準(zhǔn)稱為claims。
JWT標(biāo)準(zhǔn)里面定義的標(biāo)準(zhǔn)claim包括:
iss(Issuser):JWT的簽發(fā)主體;sub(Subject):JWT的所有者;aud(Audience):JWT的接收對象;exp(Expiration time):JWT的過期時間;nbf(Not Before):JWT的生效開始時間;iat(Issued at):JWT的簽發(fā)時間;jti(JWT ID):是JWT的唯一標(biāo)識。
除了以上標(biāo)準(zhǔn)聲明以外,我們還可以自定義聲明。以 com.auth0 為例,下面代碼片段實現(xiàn)了生成一個帶有過期時間的token。
String token = JWT.create()
.withIssuer(ISSUER)
.withIssuedAt(new Date(currentTime))// 簽發(fā)時間
.withExpiresAt(new Date(currentTime + EXPIRES_IN * 1000 * 60))// 過期時間戳
.withClaim("username", username)//自定義參數(shù)
.sign(Algorithm.HMAC256(user.getPassword()));其中:
withIssuer()設(shè)置簽發(fā)主體;withIssuedAt()設(shè)置簽發(fā)時間;withExpiresAt()設(shè)置過期時間戳,過期的時長為 EXPIRES_IN (單位秒);withClaim()設(shè)置自定義參數(shù)。
JWT設(shè)置了過期時間以后,一定超過,那么接口就不能訪問了,需要用戶重新登錄獲取token。如果經(jīng)常需要用戶重新登錄,顯然這種體驗不是太好,因此很多應(yīng)用會采用token過期后自動續(xù)期的方案,只有特定條件下才會讓用戶重新登錄。
三、token過期的續(xù)期方案
解決token過期的續(xù)期問題可以有很多種不同的方案,這里舉一些比較有代表性的例子。首先我們看一個單token方案,這個方案除了可以實現(xiàn)token續(xù)期以外,還可以實現(xiàn)某些條件下的強制重新登錄。
3.1.單token方案

- 將 token 過期時間設(shè)置為15分鐘;
- 前端發(fā)起請求,后端驗證 token 是否過期;如果過期,前端發(fā)起刷新token請求,后端為前端返回一個新的token;
- 前端用新的token發(fā)起請求,請求成功;
- 如果要實現(xiàn)每隔72小時,必須重新登錄,后端需要記錄每次用戶的登錄時間;用戶每次請求時,檢查用戶最后一次登錄日期,如超過72小時,則拒絕刷新token的請求,請求失敗,跳轉(zhuǎn)到登錄頁面。
另外后端還可以記錄刷新token的次數(shù),比如最多刷新50次,如果達(dá)到50次,則不再允許刷新,需要用戶重新授權(quán)。
上面介紹的單token方案原理比較簡單。下面我們再看一個雙token方案。
3.2.雙token方案
- 登錄成功以后,后端返回
access_token和refresh_token,客戶端緩存此兩種token; - 使用
access_token請求接口資源,成功則調(diào)用成功;如果token超時,客戶端攜帶refresh_token調(diào)用token刷新接口獲取新的access_token; - 后端接受刷新token的請求后,檢查
refresh_token是否過期。如果過期,拒絕刷新,客戶端收到該狀態(tài)后,跳轉(zhuǎn)到登錄頁;如果未過期,生成新的access_token返回給客戶端。 - 客戶端攜帶新的
access_token重新調(diào)用上面的資源接口。 - 客戶端退出登錄或修改密碼后,注銷舊的token,使
access_token和refresh_token失效,同時清空客戶端的access_token和refresh_toke。
微信網(wǎng)頁授權(quán)是通過OAuth2.0機制實現(xiàn)的,也使用了雙token方案。

微信網(wǎng)頁授權(quán)方案:
- 用戶在第三方應(yīng)用的網(wǎng)頁上完成微信授權(quán)以后,第三方應(yīng)用可以獲得 code(授權(quán)碼)。code的超時時間為10分鐘,一個code只能成功換取一次access_token即失效。
- 第三方應(yīng)用通過code獲取網(wǎng)頁授權(quán)憑證access_token和刷新憑證 refresh_token。
- access_token是調(diào)用授權(quán)關(guān)系接口的調(diào)用憑證,由于access_token有效期(2個小時)較短,當(dāng)access_token超時后,可以使用refresh_token進(jìn)行刷新。
- refresh_token擁有較長的有效期(30天),當(dāng)refresh_token失效的后,需要用戶重新授權(quán)。
后端實現(xiàn)token過期還可以利用Redis來存儲token,設(shè)置redis的鍵值對的過期時間。如果發(fā)現(xiàn)redis中不存在token的記錄,說明token已經(jīng)過期了。
以上就是Token過期實現(xiàn)自動續(xù)期的方法步驟的詳細(xì)內(nèi)容,更多關(guān)于Token過期自動續(xù)期的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java Spring @Autowired的這些騷操作,你都知道嗎
這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09
Spring Boot從項目搭建到CRUD實戰(zhàn)案例
這篇文章主要介紹了超詳細(xì)Spring Boot實戰(zhàn)案例從項目搭建到CRUD全實現(xiàn),本文基于一套完整的Spring Boot實戰(zhàn)代碼,從項目架構(gòu)、核心模塊解析、運行配置到接口測試,全方位拆解了Spring Boot整合MyBatis實現(xiàn)數(shù)據(jù)交互與接口開發(fā)的全過程,需要的朋友可以參考下2026-02-02
Java Swing JCheckBox復(fù)選框的實現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Spring-Bean創(chuàng)建對象的步驟方式詳解
在本篇文章里小編給大家分享的是關(guān)于Spring-Bean創(chuàng)建對象的步驟方式詳解內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。2020-02-02
避免sql注入_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了避免sql注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

