日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Token無(wú)感知刷新前端

來(lái)源: 責(zé)編: 時(shí)間:2024-07-11 17:33:58 725觀看
導(dǎo)讀思路Token無(wú)感知刷新是一種常見(jiàn)的技術(shù),就是在用戶無(wú)感知的情況下自動(dòng)處理Token過(guò)期的問(wèn)題,避免用戶因Token過(guò)期而被迫重新登錄。以下是實(shí)現(xiàn)Token無(wú)感知刷新的主要步驟和考慮因素:一、Token生成與存儲(chǔ)Token生成:在用戶登錄

思路

Token無(wú)感知刷新是一種常見(jiàn)的技術(shù),就是在用戶無(wú)感知的情況下自動(dòng)處理Token過(guò)期的問(wèn)題,避免用戶因Token過(guò)期而被迫重新登錄。以下是實(shí)現(xiàn)Token無(wú)感知刷新的主要步驟和考慮因素:lDT28資訊網(wǎng)——每日最新資訊28at.com

一、Token生成與存儲(chǔ)

  1. Token生成:
  • 在用戶登錄成功后,后端會(huì)生成兩個(gè)Token:一個(gè)AccessToken(用于訪問(wèn)受保護(hù)的API,過(guò)期時(shí)間較短)和一個(gè)RefreshToken(用于獲取新的AccessToken,過(guò)期時(shí)間較長(zhǎng))。
  • 可以使用JWT(JSON Web Tokens)或其他安全機(jī)制來(lái)生成和驗(yàn)證Token。
  1. Token存儲(chǔ):
  • 將AccessToken和RefreshToken存儲(chǔ)在客戶端的本地緩存中,如localStorage或sessionStorage。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 確保RefreshToken的安全性,避免在客戶端以明文形式暴露。lDT28資訊網(wǎng)——每日最新資訊28at.com

二、請(qǐng)求攔截器設(shè)置

  1. 請(qǐng)求攔截器:
  • 在發(fā)送請(qǐng)求之前,通過(guò)請(qǐng)求攔截器檢查AccessToken是否存在并未過(guò)期。
  • 如果AccessToken存在且未過(guò)期,則將其添加到請(qǐng)求的Authorization頭部。
  • 如果AccessToken不存在或已過(guò)期,則嘗試使用RefreshToken獲取新的AccessToken。
  1. 響應(yīng)攔截器:
  • 在接收到響應(yīng)后,通過(guò)響應(yīng)攔截器檢查響應(yīng)狀態(tài)碼。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 如果狀態(tài)碼為401(未授權(quán)),則表明AccessToken已過(guò)期,此時(shí)應(yīng)使用RefreshToken嘗試獲取新的AccessToken。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 如果狀態(tài)碼為200(成功)或其他有效狀態(tài)碼,則直接處理響應(yīng)數(shù)據(jù)。lDT28資訊網(wǎng)——每日最新資訊28at.com

三、Token刷新邏輯

  1. 檢查T(mén)oken是否過(guò)期:
  • 可以在請(qǐng)求攔截器中檢查AccessToken的過(guò)期時(shí)間,但這需要后端提供Token的過(guò)期時(shí)間字段,且存在本地時(shí)間被篡改的風(fēng)險(xiǎn)。
  • 更推薦的做法是在響應(yīng)攔截器中根據(jù)狀態(tài)碼(如401)來(lái)判斷AccessToken是否過(guò)期。
  1. 使用RefreshToken獲取新Token:
  • 當(dāng)檢測(cè)到AccessToken過(guò)期時(shí),使用RefreshToken向認(rèn)證服務(wù)器發(fā)送請(qǐng)求以獲取新的AccessToken和(可選的)新的RefreshToken。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 將新獲取的AccessToken保存到本地緩存,并替換掉舊的AccessToken。lDT28資訊網(wǎng)——每日最新資訊28at.com

  1. 重新發(fā)送請(qǐng)求:lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 使用新的AccessToken重新發(fā)送之前因Token過(guò)期而失敗的請(qǐng)求。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 這可能需要將失敗的請(qǐng)求暫存起來(lái),并在獲取到新Token后依次重新發(fā)送。lDT28資訊網(wǎng)——每日最新資訊28at.com

四、防止多次刷新Token

  • 設(shè)置一個(gè)標(biāo)志位(如isRefreshing)來(lái)指示當(dāng)前是否正在刷新Token。
  • 如果在刷新Token的過(guò)程中又收到了需要刷新Token的請(qǐng)求,則可以直接使用已獲取的(或正在獲取的)新Token,而不是再次發(fā)起刷新Token的請(qǐng)求。

實(shí)現(xiàn)

前端實(shí)現(xiàn)Token無(wú)感知刷新的過(guò)程主要涉及到對(duì)HTTP請(qǐng)求的攔截、Token狀態(tài)的判斷、Token的刷新以及請(qǐng)求的重發(fā)等步驟。以下是一個(gè)詳細(xì)的實(shí)現(xiàn)流程:lDT28資訊網(wǎng)——每日最新資訊28at.com

一、Token的獲取與存儲(chǔ)

  1. 用戶登錄:
  • 用戶輸入用戶名和密碼進(jìn)行登錄。
  • 登錄成功后,后端服務(wù)器會(huì)生成一個(gè)AccessToken(短期Token)和一個(gè)RefreshToken(長(zhǎng)期Token),并將它們返回給前端。
  1. 存儲(chǔ)Token:
  • 前端將AccessToken和RefreshToken存儲(chǔ)在瀏覽器的本地緩存中,如localStorage或sessionStorage。由于localStorage具有持久性,更適合存儲(chǔ)RefreshToken;而sessionStorage在頁(yè)面會(huì)話結(jié)束時(shí)會(huì)被清除,適合存儲(chǔ)AccessToken(但考慮到需要跨會(huì)話保持登錄狀態(tài),通常也會(huì)選擇localStorage)。lDT28資訊網(wǎng)——每日最新資訊28at.com

二、請(qǐng)求攔截器的設(shè)置

  1. 創(chuàng)建Axios實(shí)例:
  • 使用Axios等HTTP客戶端庫(kù)創(chuàng)建一個(gè)Axios實(shí)例,并配置基礎(chǔ)URL、請(qǐng)求超時(shí)時(shí)間等。
  1. 設(shè)置請(qǐng)求攔截器:
  • 在發(fā)送請(qǐng)求之前,通過(guò)請(qǐng)求攔截器檢查localStorage中是否存儲(chǔ)了有效的AccessToken。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 如果存在,則將AccessToken添加到請(qǐng)求的Authorization頭部。lDT28資訊網(wǎng)——每日最新資訊28at.com

  1. 設(shè)置響應(yīng)攔截器:lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 在接收到響應(yīng)后,通過(guò)響應(yīng)攔截器檢查響應(yīng)狀態(tài)碼。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 如果狀態(tài)碼為401(未授權(quán)),則表明AccessToken已過(guò)期,此時(shí)需要嘗試使用RefreshToken刷新Token。lDT28資訊網(wǎng)——每日最新資訊28at.com

三、Token刷新邏輯

  1. 檢查T(mén)oken是否過(guò)期:
  • 響應(yīng)攔截器中,根據(jù)狀態(tài)碼401判斷AccessToken是否過(guò)期。注意,更準(zhǔn)確的做法是在響應(yīng)體中包含Token過(guò)期的具體信息,但這里以狀態(tài)碼為例。
  1. 使用RefreshToken獲取新Token:
  • 發(fā)起一個(gè)POST請(qǐng)求到認(rèn)證服務(wù)器,將RefreshToken作為請(qǐng)求體或請(qǐng)求頭發(fā)送給后端。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 后端驗(yàn)證RefreshToken的有效性,并返回一個(gè)新的AccessToken(和可選的新的RefreshToken)。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 前端接收到新的AccessToken后,將其保存到localStorage中,并替換掉舊的AccessToken。lDT28資訊網(wǎng)——每日最新資訊28at.com

  1. 重新發(fā)送請(qǐng)求:lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 使用新的AccessToken重新發(fā)送之前因Token過(guò)期而失敗的請(qǐng)求。lDT28資訊網(wǎng)——每日最新資訊28at.com

  • 這可以通過(guò)將失敗的請(qǐng)求暫存起來(lái),并在獲取到新Token后依次重新發(fā)送來(lái)實(shí)現(xiàn)。lDT28資訊網(wǎng)——每日最新資訊28at.com

四、防止多次刷新Token

  • 在刷新Token的過(guò)程中,設(shè)置一個(gè)標(biāo)志位(如isRefreshing)來(lái)指示當(dāng)前是否正在刷新Token。
  • 如果在刷新Token的過(guò)程中又收到了需要刷新Token的請(qǐng)求,則可以直接使用已獲取的(或正在獲取的)新Token,而不是再次發(fā)起刷新Token的請(qǐng)求。

五、代碼示例(簡(jiǎn)化版)

由于篇幅限制,這里只提供一個(gè)簡(jiǎn)化的代碼示例框架:lDT28資訊網(wǎng)——每日最新資訊28at.com

import axios from 'axios';// 創(chuàng)建axios實(shí)例const service = axios.create({  baseURL: 'http://your-api-url', // API的base_url  timeout: 5000 // 請(qǐng)求超時(shí)時(shí)間});// 請(qǐng)求攔截器service.interceptors.request.use(  config => {    // 從localStorage獲取token,并設(shè)置到請(qǐng)求頭中    const token = localStorage.getItem('token');    if (token) {      config.headers['Authorization'] = `Bearer ${token}`;    }    return config;  },  error => {    // 處理請(qǐng)求錯(cuò)誤    console.error('請(qǐng)求錯(cuò)誤:', error); // for debug    Promise.reject(error);  });// 響應(yīng)攔截器service.interceptors.response.use(  response => {    // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么    return response.data;  },  error => {    // 處理響應(yīng)錯(cuò)誤    if (error.response && error.response.status === 401) {      // 嘗試使用RefreshToken刷新Token      return refreshToken().then(newToken => {        // 設(shè)置新的Token并重新發(fā)送請(qǐng)求        localStorage.setItem('token', newToken);        // 這里需要實(shí)現(xiàn)請(qǐng)求重發(fā)的邏輯,可以通過(guò)修改Axios實(shí)例的配置或使用其他方式      }).catch(err => {        // 刷新Token失敗,可能需要用戶重新登錄        console.error('刷新Token失敗:', err);      });    }    return Promise.reject(error);  });// 刷新Token的函數(shù)(需要實(shí)現(xiàn))function refreshToken() {  // 發(fā)送請(qǐng)求到認(rèn)證服務(wù)器獲取新的Token  // 返回Promise,解析為新的Token}

上述代碼示例是一個(gè)簡(jiǎn)化的框架,實(shí)際實(shí)現(xiàn)時(shí)需要根據(jù)具體業(yè)務(wù)需求和后端API進(jìn)行相應(yīng)的調(diào)整和完善。特別是刷新Token的函數(shù)lDT28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100468-0.htmlToken無(wú)感知刷新前端

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 既然有了HTTP,為什么還要HTTPS?

下一篇: VueConf,尤雨溪公布 Vue3.5 新特性以及無(wú)虛擬DOM版本

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 鴻蒙OS 4.0公測(cè)機(jī)型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統(tǒng)將于今天下午正式登場(chǎng),官方在發(fā)布會(huì)之前也已經(jīng)正式給出了可升級(jí)的機(jī)型產(chǎn)品,這意味著這些機(jī)型會(huì)率先支持升級(jí)享用。這次的HarmonyOS 4.0支持
  • Redmi Pad評(píng)測(cè):紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機(jī)到筆記本電腦,紅米不知不覺(jué)之間也已經(jīng)形成了自己頗有競(jìng)爭(zhēng)力的產(chǎn)品體系,在中端和次旗艦市場(chǎng)上甚至要比小米新機(jī)的表現(xiàn)來(lái)得更好,正所謂“大丈夫生居
  • 天貓精靈Sound Pro體驗(yàn):智能音箱沒(méi)有音質(zhì)?來(lái)聽(tīng)聽(tīng)我的

    這幾年除了手機(jī)作為智能生活終端最主要的核心之外,第二個(gè)可以成為中心點(diǎn)的產(chǎn)品是什么?——是智能音箱。 手機(jī)在執(zhí)行命令的時(shí)候有兩種操作方式,手和智能語(yǔ)音助手,而智能音箱只
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來(lái)自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從“最美JK”起到“最美女星&r
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見(jiàn)單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機(jī)將會(huì)在第三季度上市,如今隨著時(shí)間臨近,新機(jī)的各種消息也開(kāi)始浮出水面。據(jù)悉,這款新機(jī)將會(huì)被命名為“On
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開(kāi)發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來(lái)看看 Node.js 最新的生
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過(guò)購(gòu)物網(wǎng)站,可能遇到過(guò)圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚(yú)拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁(yè)“充值中心”入口上線了本機(jī)生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
  • 花7萬(wàn)退貨退款無(wú)門(mén):誰(shuí)在縱容淘寶珠寶商家造假?

    來(lái)源:極點(diǎn)商業(yè)作者:楊銘在淘寶購(gòu)買(mǎi)珠寶玉石后,因?yàn)楸WC金不夠賠付,店鋪關(guān)閉,退貨退款難、維權(quán)無(wú)門(mén)的比比皆是。“提供相關(guān)產(chǎn)品鑒定證書(shū),支持全國(guó)復(fù)檢,可以30天無(wú)理由退換貨。&
Top 主站蜘蛛池模板: 疏勒县| 乌拉特前旗| 南陵县| 江华| 赣榆县| 武陟县| 新绛县| 依安县| 牙克石市| 潍坊市| 永安市| 巴青县| 海口市| 遂川县| 工布江达县| 枣强县| 鄂温| 陆川县| 长寿区| 蒲江县| 南皮县| 琼结县| 阿鲁科尔沁旗| 灵台县| 昌平区| 平江县| 三明市| 天台县| 博爱县| 龙山县| 房产| 红河县| 阿坝县| 琼结县| 仲巴县| 宁晋县| 丹江口市| 长治县| 金华市| 德惠市| 烟台市|