使用axios请求无痛刷新token示例
'use strict'
import axios from 'axios'
const URL = '/'
const service = axios.create({
baseURL: URL,
withCredentials: true,
timeout: 0
})
function refreshToken(refresh) {
return service({
url: '/user/reftoken',
method: 'post',
data: { refresh }
})
}
function getrefreshToken() {
return 'refreshtoken'
}
function setrefreshToken(refresh) {
return refresh
}
function getToken() {
return 'token'
}
function setToken(token) {
return token
}
let isRefreshing = false
let requestlists = []
service.interceptors.request.use(
async config => {
const token = getToken()
if (!token) {
return Promise.reject('获取登录信息失败!')
}
config.header['token'] = token
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
service.interceptors.response.use(
async response => {
const res = response.data
const config = response.config
if (res.code === 401) {
if (config.url !== '/user/reftoken') {
return Promise.reject(res.msg)
} else {
if (!isRefreshing) {
isRefreshing = true
await refreshToken(getrefreshToken()).then(res => {
const { token, setrefres_token } = res.data
setToken(token)
setrefreshToken(setrefres_token)
requestlists.forEach(cb => cb(token))
}).catch(() => {
isRefreshing = false
})
requestlists = []
isRefreshing = false
return service(config)
} else {
return new Promise((resolve) => {
requestlists.push((token) => {
config.header['token'] = token
resolve(service(config))
})
})
}
}
} else if (res.code === 403) {
}
return res
},
error => {
return Promise.reject(error)
}
)
export default {
get: (url, params = {}) => {
return service({
url: url,
method: 'get',
params
})
},
post: (url, data = {}, headers) => {
return service({
url: url,
method: 'post',
data,
headers
})
}
}