定义请求refreshToken的url
export const REFRESH_TOKEN = "/api/getRefreshToken"
定义一个refreshToken文件
let promoseRT: any = ""
let isRefreshing = false
export function generalRefreshToken() {
if (isRefreshing) {
return promoseRT
}
isRefreshing = true
promoseRT = request({
url: REFRESH_TOKEN,
method: 'post',
data: {
refer: 'gmc',
refresh_token: getToken("refreshToken") }
}).finally(() => {
isRefreshing = false
})
return promoseRT
}
封装统一接口文件request.ts
import axios from 'axios'
import { generalRefreshToken } from "@/api/index";
import router from '@/router';
import {REFRESH_TOKEN} from '@/config/index'
let RefreshTokenCount = 0
const instance = axios.create({
baseURL: '/dev-api/',
timeout: 6000,
})
instance.interceptors.request.use(
config => {
if (config.url === REFRESH_TOKEN) {
RefreshTokenCount++;
if (RefreshTokenCount >= 10) {
router.push('/401');
return;
}
}
config.headers['Authorization'] = 'Bearer ' + getToken();
return config
},
error => {
return Promise.reject(error)
}
)
instance.interceptors.response.use(
(response) => {
return response.data
},
async (error) => {
if (error.response.status === 401) {
const { data }: any = await generalRefreshToken()
if (data && data.token) {
error.config.headers.Authorization = 'Bearer ' + data.token
setToken(data.token)
return instance(error.config);
}
}
return Promise.resolve(error)
},
)
export default instance;