前端实现token刷新
浏览量:182
why:
how:
原理
import axios, { AxiosInstance } from \axios\
import router from \@/router\
import store from \@/store\
import { message } from \ant-design-vue\
import { getToken } from \@/utils/auth\
import { refreshToken } from \@/utils/refreshToken\
// create an axios instance
const service = axios.create({
baseURL: \/api\,
timeout: 30000
})
// 请求拦截器
service.interceptors.request.use(
(config: any) => {
if (store.getters.token) {
config.headers[\Authorization\] = getToken()
}
// 登录,不校验token
if (config.url.indexOf(\/login\) > -1) {
return config
} else {
let interval = null
let retry = new Promise((resolve, reject) => {
const refreshFun = () => refreshToken().then(res => {
// 判断是否刷新token,且成功了
if (res === \success\) {
console.log(\刷新token!!!\)
config.headers[\Blade-Auth\] = `Bearer ${getToken()}`
// 挂起请求
resolve(config)
} else if (res === \pending\) {
console.log(\等待刷新token!!!\)
interval = setInterval(() => {
refreshFun()
}, 500)
} else { // 不需要刷新token或刷新失败
// 等待刷新成功后就不需要再刷新,此时需重新赋值新token
if (interval) {
console.log(\等待成功!\)
config.headers[\Blade-Auth\] = `Bearer ${getToken()}`
clearInterval(interval)
}
// 挂起请求
resolve(config)
}
})
refreshFun()
})
return retry
}
},
error => {
return Promise.reject(error)
}
)
// 返回拦截器
service.interceptors.response.use(
response => {
if (response.data.success) {
// 若为登录接口,记录登录返回的时间
if (response.config.url.indexOf(\/login\) > -1) {
const time = String(new Date().getTime())
localStorage.setItem(\loginTime\, time)
}
return Promise.resolve(response.data)
}
response.data.msg && message.error(response.data.msg)
return Promise.reject(response.data.msg)
},
error => {
if (error.response.status && error.response.status === 401) {
store.dispatch(\user/logout\)
router.push(\/login\)
}
error.response.data.msg && message.error(error.response.data.msg)
return Promise.reject(error)
}
)
export default service as AxiosInstance


感谢支持与鼓励~