vue请求拦截-统一配置请求头
/* 直接引入这个文件作为xios
import axios from './http' main.js里也要引入
*/// import Vue from 'vue'
import { Toast } from 'vant';
import axios from "axios"
import { restUrl as baseUrl } from '@/config'
import { list } from '@/common/js/url-white-list'
import { codeHeaders, encryptBody } from '@/common/js/sm.js'
import router from '@/router'
import store from '../store'
axios.defaults.withCredentials = true
axios.defaults.baseURL = baseUrl
axios.interceptors.request.use(
config => {
let newConfig = config;
let token = window.localStorage.getItem('access_token')
if (process.env.VUE_APP_ENCRYPTION === '1') {
newConfig = codeHeaders(config)
newConfig = encryptBody(newConfig)
} else {
newConfig = config;
}
// 不需要token的请求
for (const i of list) {
if (newConfig.url.indexOf(i) != -1) {
return newConfig;
}
}
//设置请求头
newConfig.headers['Authorization'] = 'Bearer ' + token
//是否正在刷新token true延迟请求,不是就返回正常的请求头
const isRefresh = store.state.isRefresh
if (isRefresh) {
return new Promise((resolve) => {
setTimeout(() => {
let token = window.localStorage.getItem('access_token')
newConfig.headers['Authorization'] = 'Bearer ' + token
resolve(newConfig);
}, 1000);
})
} else {
return newConfig;
}
},
error => {
// store.dispatch('hideLoading'); //本来是说要加统一的请求loading的 后面各方面考虑没有加
return Promise.reject(error);
})
axios.interceptors.response.use(
response => {
// store.dispatch('hideLoading');
return response
},
error => {
// store.dispatch('hideLoading');
// // 非法的身份或者身份过期,需要重新登录 // 先退出,在登录 && error.response.config.url.indexOf('/ycloud-user/users/logOut') === -1)
if (error.response.status !== 400) {
if (error.response.status === 401) {
router.push('/login');
} else if (error.response.status === 403) { // 未授权访问,给用户提示或路由到一个其他错误页面
router.push('/login');
} else if (error.response.status === 500 && error.response.data.error == 'Internal Server Error') { // 未授权访问,给用户提示或路由到一个其他错误页面
if (error.response.data.message === '原始口令校验失败。') {
Toast({ message: '原始密码输入错误', duration: 2000 });
} else if (error.response.data.message === '原始口令与新口令不能一样。') {
Toast({ message: '旧密码和新密码不能重复', duration: 2000 });
} else {
return Promise.reject(error);
}
} else if (error.response.status === 500 || error.response.status === 503) {
router.push('/error');
} else if (error.response.status === 504) {
router.push('/error');
Toast({ message: '请求超时,请刷新页面', duration: 2000 });
} else {
// Toast({message:'请求异常',duration:5000});
router.push('/error');
return Promise.reject(error);
}
} else {
return Promise.reject(error);
}
})
export default axios
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步