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

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

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

