背景:
我们在做后台管理系统时通常会封装统一的http请求,这样方便我们来管理axios请求配置
- 我们通常会在请求是定义一个超时时间
- 在请求拦截器中做token的:超时、更新、headers请求头的处理
- 在响应拦截器中做 请求失败状态时的错误处理和成功直接返回结果。
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTimeStamp, getRefreshToken, getExpiresIn } from '@/utils/auth'
const TimeOut = getExpiresIn() // token失效时间
const refreshTokenTime = TimeOut - 900 // 开始换token的时间
var refreshToken = 0 // 换token只请求一次标识
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 设置axios请求的基础的基础地址
timeout: 15000 // 定义5秒超时
}) // 创建一个axios的实例
// 请求拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
const checkTime = IsCheckTimeOut()
// console.log(checkTime, '当前使用时间')
// console.log(checkTime > TimeOut)
// console.log(refreshTokenTime < checkTime && TimeOut > checkTime)
if (checkTime) {
if ((checkTime > TimeOut) && !config.url.includes('/logout')) {
console.log('登出')
store.dispatch('user/logout') // 登出操作
return Promise.reject(new Error('token超时了'))
} else if ((refreshTokenTime < checkTime && TimeOut > checkTime) && !config.url.includes('/refresh/Token') && refreshToken !== 1) {
console.log('刷新')
var params = {
systemCode: process.env.VUE_APP_CLIENT_ID,
refreshToken: getRefreshToken()
}
refreshToken = 1
store.dispatch('user/refreshToken', params).then(() => {
refreshToken = 0
console.log(store.getters.token, '更新了token')
})
}
}
config.headers['Authorization'] = `${store.getters.token}`
}
return config // 必须返回配置
}, error => {
return Promise.reject(error)
})
// 响应拦截器
service.interceptors.response.use(response => {
// axios默认加了一层data
const data = response.data
// 要根据success的成功与否决定下面的操作
if (data.success) {
return data
} else {
Message.error(data.message) // 提示错误消息
return Promise.reject(new Error(data.message))
}
}, error => {
if (error.response && error.response.data && error.response.data.code === 8888) {
store.dispatch('user/logout') // 登出操作
router.push('/login')
} else {
Message.error(error.message) // 提示错误信息
}
return Promise.reject(error) // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
})
// 是否超时
// 超时逻辑 (当前时间 - 缓存中的时间) 是否大于 时间差
function IsCheckTimeOut() {
var currentTime = Date.now()
if (getTimeStamp()) {
var timeStamp = getTimeStamp()
return (currentTime - timeStamp) / 1000
} else {
return null
}
}
export default service
工作之余 用博客记录自己 希望有能帮助到各位看官
如有错误或不全面的地方望各位能提点一二和留下宝贵意见