当前位置: 首页 > article >正文

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')
            // }
            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;


http://www.kler.cn/a/396728.html

相关文章:

  • The 3rd Universal CupStage 15: Chengdu, November 2-3, 2024(2024ICPC 成都)
  • 单片机智能家居火灾环境安全检测
  • Day 65 || SPFA、判断负权回路、bellman_ford之单源有限最短路
  • WPF中如何使用区域导航
  • 使用--log-file保存pytest的运行日志
  • 民事诉讼中,火灾事故认定书并非不可推翻,其证明力弱于鉴定意见
  • 哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业
  • Java集合 List——针对实习面试
  • hot100--数组
  • 数据研发基础| 什么是数据漂移
  • 推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro
  • 【python系列】python数据类型之数字类型
  • el-table 纵向垂直表头处理
  • Rust编程与项目实战-特质(Trait)
  • 雷达信号处理的流程和恒虚警检测CFAR
  • Linux通过端口号找到程序启动路径(Ubuntu20)
  • 贝叶斯网络——基于概率的图模型(详解)
  • Molecular signatures database (MSigDB) 3.0
  • 使用YOLOv9进行图像与视频检测
  • 浪浪云轻量服务器搭建vulfocus网络安全靶场
  • kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署
  • ctfshow(328)--XSS漏洞--存储型XSS
  • 2024年11月第2个交易周收盘总结
  • VLC-QT----Linux编译并运行示例
  • 信息安全工程师(83)Windows操作系统安全分析与防护
  • aws中AcmClient.describeCertificate返回值中没有ResourceRecord