无感刷新token

无感刷新token

https://github.com/Ruan8/refresh-token-demo

根据后端返回状态码判断token是否已过期,然后通过refreshToken请求刷新token做到无感刷新

const service = axios.create({
    baseURL: "/",
});

let isRefreshing = false; // 刷新token状态
let refreshRequest = [];

// 添加请求拦截器
service.interceptors.request.use(
    function (config) {
        config.headers.token = localStorage.getItem("token") || "";
        return config;
    },
    function (error) {
        return Promise.reject(error);
    }
);

// 添加响应拦截器
service.interceptors.response.use(
    function (response) {
        return response.data;
    },
    function (error) {
        // 处理当返回的状态码是401
        const refreshToken = localStorage.getItem("refreshToken");
        const config = error.config;
        if (error.response.status === 401 && refreshToken) {
            if (!isRefreshing) {
                // 防止多次请求刷新token
                isRefreshing = true;
                return service({
                    method: "get",
                    url: "refreshToken",
                    params: {
                        refreshToken,
                    },
                })
                    .then((res) => {
                        localStorage.setItem("token", res.token);
                        localStorage.setItem("refreshToken", res.refreshToken);
                        config.headers.token = res.token;
                        refreshRequest.forEach((item) => {
                            item(res.token);
                        });
                        refreshRequest = [];
                        return service(config);
                    })
                    .catch(() => {
                        // 跳转登陆页
                    })
                    .finally(() => {
                        isRefreshing = false;
                    });
            } else {
                return new Promise((resolve) => {
                    // 保存到一个队列里面,等刷新完token再执行
                    refreshRequest.push((token) => {
                        config.headers.token = token;
                        resolve(service(config));
                    });
                });
            }
        }
        return Promise.reject(error);
    }
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值