前端無感刷新 Token 的 Axios 封裝方案

在現代前端應用中,基于 Token 的身份驗證已成為主流方案。然而,Token 過期問題常常困擾開發者 —— 如何在不打斷用戶操作的情況下自動刷新 Token,實現 "無感刷新" 體驗?本文將詳細介紹基于 Axios 的解決方案。

什么是無感刷新 Token?

無感刷新 Token 指的是當用戶訪問需要身份驗證的接口時,若當前 Token 已過期,系統自動使用刷新 Token 獲取新的訪問 Token,并用新 Token 重新發起原請求,整個過程對用戶完全透明,不影響用戶操作流程。

實現思路
  1. 攔截所有請求,在請求頭中自動添加 Token
  2. 攔截響應,檢測 Token 過期錯誤
  3. 當 Token 過期時,使用刷新 Token 獲取新的訪問 Token
  4. 用新 Token 重新發起原請求,并將結果返回給用戶
  5. 處理并發請求問題,避免多次刷新 Token

代碼

auth.js:

// Token存儲工具函數// 存儲Token到本地存儲
export const setToken = (token) => {localStorage.setItem('accessToken', token);
};// 從本地存儲獲取Token
export const getToken = () => {return localStorage.getItem('accessToken');
};// 存儲刷新Token到本地存儲
export const setRefreshToken = (refreshToken) => {localStorage.setItem('refreshToken', refreshToken);
};// 從本地存儲獲取刷新Token
export const getRefreshToken = () => {return localStorage.getItem('refreshToken');
};// 清除所有Token
export const removeTokens = () => {localStorage.removeItem('accessToken');localStorage.removeItem('refreshToken');
};

request.js:

import axios from 'axios';
import { getToken, getRefreshToken, setToken, removeTokens } from './auth';// 創建axios實例
const service = axios.create({baseURL: process.env.VUE_APP_BASE_API, // 基礎URLtimeout: 5000 // 請求超時時間
});// 是否正在刷新的標記
let isRefreshing = false;
// 存儲等待刷新的請求隊列
let requests = [];// 請求攔截器
service.interceptors.request.use(config => {// 從本地存儲獲取Tokenconst token = getToken();// 如果Token存在,則添加到請求頭if (token) {config.headers['Authorization'] = `Bearer ${token}`;}return config;},error => {// 請求錯誤處理return Promise.reject(error);}
);// 響應攔截器
service.interceptors.response.use(response => {// 成功響應處理return response.data;},async error => {const originalRequest = error.config;// 如果不是401錯誤或者已經重試過,則直接返回錯誤if (error.response?.status !== 401 || originalRequest._retry) {return Promise.reject(error);}// 如果正在刷新Token,則將請求加入隊列if (isRefreshing) {try {// 等待刷新Token完成const token = await new Promise(resolve => {requests.push(token => {resolve(token);});});// 使用新Token重新發起請求originalRequest.headers['Authorization'] = `Bearer ${token}`;return service(originalRequest);} catch (err) {return Promise.reject(err);}}// 標記為正在刷新TokenoriginalRequest._retry = true;isRefreshing = true;try {// 調用刷新Token接口const refreshToken = getRefreshToken();const { data } = await axios.post(`${process.env.VUE_APP_BASE_API}/refresh-token`, {refreshToken});// 存儲新的TokensetToken(data.token);// 執行隊列中的請求requests.forEach(cb => cb(data.token));requests = [];// 重新發起原請求originalRequest.headers['Authorization'] = `Bearer ${data.token}`;return service(originalRequest);} catch (refreshError) {// 刷新Token失敗,清除Token并跳轉登錄頁removeTokens();window.location.href = '/login';return Promise.reject(refreshError);} finally {// 重置刷新狀態isRefreshing = false;}}
);export default service;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94079.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94079.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】線性表——鏈表

這里寫自定義目錄標題線性表鏈表(鏈式存儲)單鏈表的定義單鏈表初始化不帶頭結點的單鏈表初始化帶頭結點的單鏈表初始化單鏈表的插入按位序插入帶頭結點不帶頭結點指定結點的后插操作指定結點的前插操作單鏈表的刪除按位序刪除(帶頭結點&#…

容器安全實踐(三):信任、約定與“安全基線”鏡像庫

容器安全實踐(一):概念篇 - 從“想當然”到“真相” 容器安全實踐(二):實踐篇 - 從 Dockerfile 到 Pod 的權限深耕 在系列的前兩篇文章中,我們探討了容器安全的底層原理,并詳細闡述…

百度面試題:賽馬問題

題目現在有25匹馬和一個賽馬場,賽馬場有5條跑道(即一次只能比較5匹馬),并且沒有秒表等計時工具,因此每次賽馬只能知道這5匹馬的相對時間而非絕對時間。問:如何篩選出跑的最快的3匹馬?需要比賽幾…

centos下安裝Nginx(搭建高可用集群)

CentOS-7下安裝Nginx的詳細過程_centos7安裝nginx-CSDN博客 centos換yum軟件管理包鏡像 CentOS 7.* 更換國內鏡像源完整指南_centos7更換國內源-CSDN博客 VMware虛擬機上CentOS配置nginx后,本機無法訪問 執行命令:/sbin/iptables -I INPUT -p tcp --dport 80 -j…

實時視頻技術選型深度解析:RTSP、RTMP 與 WebRTC 的邊界

引言:WebRTC 的“光環”與現實落差 在實時音視頻領域,WebRTC 常常被貼上“終極解決方案”的標簽:瀏覽器原生支持、無需插件、點對點傳輸、毫秒級延遲,這些特性讓它在媒體和開發者群體中擁有了近乎神話般的地位。許多人甚至認為&a…

基于深度學習的阿爾茨海默癥MRI圖像分類系統

基于深度學習的阿爾茨海默癥MRI圖像分類系統 項目概述 阿爾茨海默癥是一種進行性神經退行性疾病,早期診斷對于患者的治療和生活質量至關重要。本項目利用深度學習技術,基于MRI腦部掃描圖像,構建了一個高精度的阿爾茨海默癥分類系統&#xff0…

54 C++ 現代C++編程藝術3-移動構造函數

C 現代C編程藝術3-移動構造函數 文章目錄C 現代C編程藝術3-移動構造函數場景1&#xff1a;動態數組資源轉移 #include <iostream> #include <vector> class DynamicArray { int* data; size_t size; public: // 移動構造函數&#xff08;關鍵實現&#xf…

Sping Boot + RabbitMQ :如何在Spring Boot中整合RabbitMQ實現消息可靠投遞?

Spring Boot整合RabbitMQ實現消息可靠投遞全解析 在分布式系統中&#xff0c;消息中間件是解耦、異步、流量削峰的核心組件。RabbitMQ作為高可靠、易擴展的AMQP協議實現&#xff0c;被廣泛應用于企業級場景。但消息傳遞過程中可能因網絡波動、服務宕機等問題導致消息丟失&#…

STAR-CCM+|K-epsilon湍流模型溯源

【1】引言 三維CFD仿真經典軟件很多&#xff0c;我接觸過的有Ansys和STAR-CCM兩種。因為一些機緣&#xff0c;我使用STAR-CCM更多&#xff0c;今天就來回顧一下STAR-CCM中K-epsilon湍流模型的基本定義。 【2】學習地址介紹 點擊鏈接User Guide可以到達網頁版本的STAR-CCM 24…

osgEarth 圖像融合正片疊底

* 需求&#xff1a;* 高程渲染圖 RGB.tif、 山體陰影圖 AMP.tif** 高程渲染圖 rgb波段分別 乘以 山體陰影圖r波段&#xff0c; 然后除以255(AI說 讀取的紋理就已經歸一化到了 0~1 范圍&#xff0c;不用除以 255)。本人遙感知識匱乏。問了AI,以上 需求在許多商業軟件上已實現。…

Java接口響應速度優化

在 Java 開發中&#xff0c;接口響應速度直接影響用戶體驗和系統吞吐量。優化接口性能需要從代碼、數據庫、緩存、架構等多個維度綜合考量&#xff0c;以下是具體方案及詳細解析&#xff1a;一、代碼層面優化代碼是接口性能的基礎&#xff0c;低效的代碼會直接導致響應緩慢。1.…

A Large Scale Synthetic Graph Dataset Generation Framework的學習筆記

文章的簡介 作者提出了一個可擴展的合成圖生成框架&#xff0c;能夠從真實圖中學習結構和特征分布&#xff0c;并生成任意規模的圖數據集&#xff0c;支持&#xff1a; 節點和邊的結構生成節點和邊的特征生成特征與結構的對齊&#xff08;Aligner&#xff09; 它區別于GraphWor…

Android12 Framework讀寫prop屬性selinux報錯解決

文章目錄問題描述解決過程相關文章問題描述 Android讀prop值時&#xff0c;就算是system應用&#xff0c; 也需要selinux權限&#xff0c;否則會報錯。 java代碼如下 SystemProperties.get("ro.input.resampling", "")selinux報錯如下 2025-06-28 17:57:…

【圖文版】AIOT 小智 AI 聊天機器人 ESP32 項目源碼圖解

前言 小智 AI 聊天機器人是最近一個很火的開源項目&#xff0c;它借助LLM大模型以及TTS等AI的能力&#xff0c;通過自然語言來與其對話實現交互。它可以回答任何問題、播放音樂、背誦古詩&#xff0c;頗有未來AI機器人的雛形。 因為最近工作上的需要對其進行了研究&#xff0c;…

250821-RHEL9.4上Docker及Docker-Compose的離線安裝

在 離線環境下 在 RHEL (Red Hat Enterprise Linux) 系統上安裝 Docker 和 Docker Compose&#xff0c;需要提前在有網絡的環境中下載相關 RPM 包及依賴&#xff0c;然后在目標機器上進行安裝。以下是比較完整的步驟&#xff1a; 1. Docker及Docker-Compose離線安裝 在 RHEL 9.…

react相關知識

1.類組件和函數組件&#xff08;1&#xff09;類組件import React, { Component } from react;class UserProfile extends Component {constructor(props) {super(props);this.state {userData: null,isLoading: true,};this.timerId null;}componentDidMount() {// 模擬 API…

算法第五十五天:圖論part05(第十一章)

并查集理論基礎并查集主要有兩個功能&#xff1a;將兩個元素添加到一個集合中。判斷兩個元素在不在同一個集合class UnionFind:def __init__(self, n):"""初始化并查集"""self.n nself.father list(range(n)) # 每個節點自己是根self.rank […

雨霧天氣漏檢率驟降80%!陌訊多模態車牌識別方案實戰解析

一、行業痛點&#xff1a;車牌識別的天氣敏感性據《智慧交通系統檢測白皮書》統計&#xff0c;雨霧環境下傳統車牌識別漏檢率高達42.7%&#xff08;2024年數據&#xff09;。主要存在三大技術瓶頸&#xff1a;1.??水膜干擾??&#xff1a;擋風玻璃水漬導致車牌區域紋理模糊2…

PostgreSQL15——查詢詳解

PostgreSQL15查詢詳解一、簡單查詢1.1、單表查詢1.2、無表查詢1.3、消除重復結果1.4、使用注釋二、查詢條件2.1、WHERE子句2.2、模式匹配2.3、空值判斷2.4、復雜條件三、排序顯示3.1、單列排序3.2、多列排序3.3、空值排序四、限定結果數量4.1、Top-N查詢4.2、分頁查詢4.3、注意…

03-容器數據卷

卷就是目錄或文件&#xff0c;存在于一個或多個容器中&#xff0c;由 docker 掛載到容器&#xff0c;但不屬于聯合文件系統&#xff0c;因此能夠繞過 UnionFS&#xff0c;提供一些用于持續存儲或共享數據。 特性&#xff1a;卷設計的目的就是數據的持久化&#xff0c;完全獨立于…