赞
踩
import axios from 'axios' // 待重试的请求队列 let requestsQueue: Function[] = [] // 正在请求token的标志值 let isFreshToken = false // 从接口获取token值 function getToken () { return http.get('/api/token').then(res => { return res.data.data.result }) } const getSToken = () =>{ return sessionStorage.getItem('__token__') } const setSToken = (token: string) =>{ return sessionStorage.setItem('__token__', token) } const http = axios.create({ timeout: 3000 }) http.interceptors.request.use((config) => { // 请求 token URL 直接放行 if(config.url?.match('token')) { return config } config.url = `${config.url}?t=${new Date().getTime()}` // 从sessionStorage 中获取 token const crsfToken = getSToken() // 当token 没有的时候 就去请求token if(!crsfToken) { if(!isFreshToken){ isFreshToken = true getToken().then(token => { setSToken(token) requestsQueue.forEach(cb => { cb(token) }) requestsQueue = [] }).finally(() => { isFreshToken = false }) } // 将config 存储在 requestsQueue 刷新队列中 return new Promise(resolve => { requestsQueue.push(token => { config.headers['x-crsf-token'] = token resolve(config) }) }) } config.headers['x-crsf-token'] = crsfToken return config }) http.interceptors.response.use(res =>{ return res; }) export default http
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。