axios请求拦截和响应拦截
请求拦截器:
**作用:**用于我们在网络请求的时候在发起请求或者响应的时候对操作进行响应的处理
**使用场景:**在发起请求时在等待服务器响应时添加网页加载的动画 使用token认证时在请求之前判断用户是否有token信息 没有时强制登录
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断vuex中是否存在token
// 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
},
// 对请求错误做些什么
error => {
return Promise.error(error);
})
响应拦截器:
**作用:**服务器返回给我们的数据,我们在拿到之前可以对他进行一些处理
使用场景:请求后台时不能成功返回(不是200)就进行了错误的统一处理和没登录或登录过期后调整登录页的一个操作。
axios.interceptors.response.use(
response => {
// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
// 否则的话抛出错误
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是2开头的的情况
// 服务器状态码不是2开头的的情况 根据和后台开发人员协商好统一的错误状态码 提示对应的错误信息
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登路 携带当前页面的路径
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token过期 清除本地token和清空vuex中token对象 跳转登录页面 case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
});