Axios发起请求,并拦截刷新TOKEN,结合教程里面的Api实战写的。刷新TOKEN会有重复的问题

因为我在页面中模拟了三次请求,所以TOKEN失效后会有三次重复,也就这个缺点了

目前还有一个缺点,就是如果一个页面有三个请求,然后刚才TOKEN过期,会重复三个请求

import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import dayjs from 'dayjs';

const service = axios.create({
    baseURL: "http://localhost:8080/api/v1",
    timeout:5000,
    headers: {
        "Content-Type": "application/json;charset=utf-8"
    }
})

const http = axios.create({
    baseURL: "http://localhost:8080/api/v1",
    timeout:5000,
    headers: {
        "Content-Type": "application/json;charset=utf-8"
    }
})

// 用于刷新TOKE的请求拦截器
http.interceptors.request.use(config => {
    if(localStorage.getItem('token')) {
        config.headers.Authorization = "Bearer " + localStorage.getItem('token') || ''
    }
    return config
})

// 请求拦截
service.interceptors.request.use(config => {

    // token已经过期
    if(localStorage.getItem("expires_in") && localStorage.getItem("token") && localStorage.getItem("expires_in") < dayjs().unix()) {
        return new Promise(function(resolve, reject) {
            http({
                url: "authorizations/current",
                method: "put",
            }).then(response => {
                localStorage.setItem("token", response.data.access_token)
                localStorage.setItem("expires_in", dayjs().add(response.data.expires_in, 'second').unix())

                config.headers.Authorization = "Bearer " + response.data.access_token
                resolve(config)
            })
        })
    }else {
        if(localStorage.getItem('token')) {
            config.headers.Authorization = "Bearer " + localStorage.getItem('token') || ''
        }
        return config
    }
})

// 响应拦截
service.interceptors.response.use(response => {
    const code = response.data.code
    return response
})

export default service

我实在想不到办法,有高手帮忙一下

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

接口放到 axios.all 里面发送

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!