Skip to main content

拦截器

在请求或响应被 then 或 catch 处理前拦截它们.

请求拦截器

请求拦截器中可以设置加载动画,设置 token 等

interceptors[ˌɪntərˈsɛptərz]:拦截器

设置统一的请求头:token

  1. 每次发送请求之前判断 本地/内存 中是否存在 token
  2. 如果存在,则统一在 http 请求的 header 都加上 token,这样后台根据 token 判断你的登录情况
  3. 即使本地存在 token,也有可能 token 是过期的,所以在响应拦截器中要对返回状态进行判断

cookie 中 token

axios.interceptors.request.use(
config => {
//config配置
//设置统一的请求头
if (cookie.getCookie('token')) {
config.headers.Authorization = 'Bearer ' + cookie.getCookie('token')
}
return config
},
function (error) {
return Promise.reject(error)
}
)

Vuex 中 token

// 先导入vuex,因为我们要使用到里面的状态对象
import store from '@/store/index'

axios.interceptors.request.use(
config => {
const token = store.state.token
token && (config.headers.Authorization = token)
return config
},
error => {
return Promise.error(error)
}
)

响应拦截器

// 响应拦截器
axios.interceptors.response.use(
response => {
if (response.status === 200) { // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
return Promise.resolve(response);
} else { // 否则的话抛出错误
return Promise.reject(response);
}
},
// 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: { //query[ˈkwɪri]
redirect: router.currentRoute.fullPath // redirect[ˈriːdərekt]:重新使用 }
});
break;

// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
alert("登录过期,请重新登录")
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;

// 404请求不存在
case 404:
alert("网络请求不存在")
break;
// 其他错误,直接抛出错误提示
default:
alert(error.response.data.message)
}
return Promise.reject(error.response);
}
}
});