import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router/index'
import { Loading } from 'element-ui'
let loading = null
// 创建axios
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
// baseURL: process.env.VUE_APP_MOCK_API, // mock 地址
// withCredentials: true, // send cookies when cross-domain requests
timeout: 100000 // 超时
})
// 请求拦截
service.interceptors.request.use(
config => {
const lastTime = localStorage.getItem('lastTokenTime') // 最后请求时间
const nowTime = Date.now() // 当前时间
const loginTime = localStorage.getItem('loginTime') // 登录时间
// 判断是否有登录 时间戳 60000等于1分钟
if (loginTime && loginTime !== 0) {
// 判断是否长时间登陆无操作 大于就是长时间无操作 14400000 4个小时 小于就判断更新token
if (nowTime - lastTime > 14400000) {
// 将登录的时间设置为0
localStorage.setItem('loginTime', 0)
// 调用store里的退出登录
// store.dispatch('user/logout')
// 刷新页面到login页面
location.reload()
// 最后请求的时间减去登录时间大于token限制时间 刷新token
} else if (lastTime - loginTime > 14000000) {
// 调用登录接口
store.dispatch('user/refreshLogin')
// 重新计算登录时间
localStorage.setItem('loginTime', nowTime)
}
}
if (config.method.toLocaleLowerCase() !== 'get') {
config.data = config.params
delete config.params
}
if (config.isDefaultLoading) {
loading = Loading.service({
background: 'rgba(0,0,0,0.2)'
})
}
if (getToken()) {
// 如果有token
// 带上token
config.headers['Authorization'] = getToken()
config.headers['accessToken'] = getToken()
}
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
const errorTip = '服务器开小差啦~'
// 响应拦截
service.interceptors.response.use(
response => {
const res = response.data
const dates = Date.now() // 获取当前时间戳
localStorage.setItem('lastTokenTime', dates) // 临时存储最后操作时间
if (response.config.isDefaultLoading) {
loading.close()
}
switch (res.code) {
case 10000:
return res
case 10403:
Message({
message: res.message || 'Token未授权',
type: 'error'
})
router.replace({
path: '/401'
})
return Promise.reject(res)
case 10401:
Message({
message: res.message || 'token无效,请重新登录',
type: 'error'
})
setTimeout(() => {
store.dispatch('user/resetToken').then(() => {
location.reload() //TODO 跳转登录页
})
}, 1000)
return Promise.reject(res)
default:
console.log('res',res)
Message({
message: res.msg || res.error || errorTip,
type: 'error'
})
return Promise.reject(res)
}
},
error => {
if (error.config.isDefaultLoading) {
loading.close()
}
const errorData = error.response.data
Message({
message: errorData.msg || errorTip,
type: 'error'
})
return Promise.reject(error)
}
)
export default service
axios的拦截器封装
最新推荐文章于 2024-07-24 15:30:34 发布