-
实现思路
- 首次登录前端通过接口获取到两个 token;分别是 accessToken、refreshToken;
- accessToken:正常请求需要传递的 token ;
- refreshToken:当某个请求 401 ,就可以通过 refreshToken 获取到新的 accessToken
- 特殊场景:如果 refreshToken 也过期了 ,那就默认跳回 登录页,重新登录,就类似 七天免登录的场景、过了 第七天,refreshToken 也就过期了;
-
代码
1.javascriptimport axios from "axios"; import { refreshToken } from "../api/index"; //刷新token的api let isRefreshToken = false; //是否正在进行刷新token let requestList = []; // 请求队列 const request = axios.create({ baseURL: "/api", timeout: 10000, }); // 请求拦截器 request.interceptors.request.use( (config) => { let headerToken = localStorage.getItem("acc_token"); // 设置请求头 config.headers.Authorization = `Bearer ${headerToken}`; return config; }, (error) => { // 请求错误时做些事 return Promise.reject(error); } ); // 响应拦截器 request.interceptors.response.use( async (response) => { // 401 代表token过期,需要刷新token if (response.data.code == 401) { // 这里可以加入判断,判断 refreshToken 也过期了,直接 router.push 回登录页 // if () { // router.push('/login') // } if (!isRefreshToken) { isRefreshToken = true; let res = await refreshToken(); // 刷新 token 的接口 isRefreshToken = false; localStorage.setItem("acc_token", res.data.accToken); // 重发请求队列请求 requestList.forEach((callback) => { callback(); }); requestList = []; let currentRequest = await request(response.config); return currentRequest; } else { // 将并发的请求,通过回调函数暂存起来,当token 刷新之后,在进行请求 return new Promise((resolve) => { requestList.push(() => { resolve(request(response.config)); }); }); } } return response; }, (error) => { return Promise.reject(error); } ); export default request;
axios 实现 无感刷新方案
清云随笔2024-11-15 14:19
相关推荐
Aniugel9 分钟前
单点登录(SSO)系统鹏多多12 分钟前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?serioyaoyao14 分钟前
上万级文件一起可视化,怎么办?答案是基于 ParaView 的远程可视化万少20 分钟前
端云一体 一天开发的元服务-奇趣故事匣经验分享WindrunnerMax22 分钟前
从零实现富文本编辑器#11-Immutable状态维护与增量渲染不想秃头的程序员24 分钟前
Vue3 封装 Axios 实战:从基础到生产级,新手也能秒上手数研小生37 分钟前
亚马逊商品列表API详解你听得到1139 分钟前
我彻底搞懂了 SSE,原来流式响应效果还能这么玩的?(附 JS/Dart 双端实战)不倒翁玩偶40 分钟前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。