1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| import axios from 'axios' import i18n from '@/lang' import { Message, MessageBox } from 'element-ui' import store from '../store' import { getToken, getRefreshToken } from './auth' import refreshJwt from './refreshJwt' let isLock = true
// 创建axios实例 const service = axios.create({ baseURL: process.env.BASE_API, // api 的 base_url timeout: 50000, // 请求超时时间, headers: { 'Content-Type': 'application/json;charset=utf-8' } // withCredentials : true })
/** * 通用请求拦截配置 * @param {*} config */ const axiosConf = (config) => { if (store.getters.token) { config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } return config }
// request 拦截器 service.interceptors.request.use(axiosConf, error => { console.log(error) return Promise.reject(error) })
// response 拦截器 service.interceptors.response.use( async response => { /** * code为非0是抛错 可结合自己业务进行修改 */ let data = {} const res = response.data const code = Number(res.code) if (code !== 0) { // 50014:Token 过期了; if (code === 50014) { if ((getRefreshToken() !== 'undefined' && getRefreshToken()) && isLock) { // 异步刷新JWT await refreshJwt() // 这里防止并发的时候造成死循环,所以要加锁 isLock = false // 刷新完成,继续之前的请求 response.config.headers['X-Token'] = getToken() const result = await axios.request(axiosConf(response.config)) if (result) { data = result.data isLock = true } } else { // 身份过期,请重新登录 MessageBox.confirm( 'Token失效,你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { confirmButtonText: '重新登陆', cancelButtonText: '取消', type: 'warning' } ).then(() => { store.dispatch('FedLogOut').then(() => { location.reload() // 为了重新实例化vue-router对象 避免bug }) }) } } else { // 消息提示 message(res.message) } } else { data = response.data } return data }, error => { console.log('错误信息:' + error) message('哎呀~ (ಥ﹏ಥ)网络又开小差了,请稍后刷新重试!') return Promise.reject(error) } )
/** * 消息提醒 * @param msg */ export function message(msg) { Message({ message: msg, type: 'error', showClose: true, duration: 5 * 1000 }) }
export default service
|