axios 实现 无感刷新方案

  1. 实现思路
    1. 首次登录前端通过接口获取到两个 token;分别是 accessToken、refreshToken;
    2.  accessToken:正常请求需要传递的  token ;
    3. refreshToken:当某个请求 401 ,就可以通过 refreshToken 获取到新的 accessToken
    4.  特殊场景:如果 refreshToken 也过期了 ,那就默认跳回 登录页,重新登录,就类似  七天免登录的场景、过了 第七天,refreshToken  也就过期了;
  2. 代码
    1. 
      import 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')
            // }
            // 因为请求都是异步的,所以,第一个请求肯定会进入这里,后续失败的请求肯定是 走 else 的
            // 然后就可以实现收集 无感刷新啦
            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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清云随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值