**
vue的拦截器使用,和token失效后的刷新token,发送之前的失败请求
**
1.axios请求拦截器
axios.interceptors.request.use((config) => {
// 添加header头的token
let token = store.state.user.access_token;//获取vuex里存的token
if (token) {
config.headers['Authorization'] = token
}
//登陆验证信息
if (store.state.user.Authorization) {
config.headers['X-Authorization-With'] = store.state.user.Authorization;
}
//arenaId放到header请求头上
if (store.state.user.arenaId) {
config.headers['arenaId'] = store.state.user.arenaId;
}
// 在发送请求之前做些什么
return config;
}, (error) => {
// 对请求错误做些什么
return Promise.reject(error);
});
2.axios响应拦截器(刷新新token,发送因token失效而请求失败的接口重新获取数据)
axios.interceptors.response.use((response) => {
// 对响应数据做点什么
if (!store.state.user.Authorization && response.headers['x-authorization-with']) {
Authorization = response.headers['x-authorization-with'];
store.state.user.Authorization = Authorization;
}
return response;
}, (err) => {
//请求返回错误的时候返回的请求数据
var r=err.config;
// 全局错误提示
if (err.response && err.response.data && err.response.data.errorCode) {
Message.error(err.response.data.msg)
}
//接口无访问权限
if (err && err.response && err.response.status === 401) {
store.commit("ADDTOKEN", "");//清理token
var s = store.state.user.refresh_token;//使用备用token,来换取新token
const basicAuthorization =
"Basic " + btoa("web_app:spring-microservice-exam-secret");
//获取新token
axios({
method: "post",
url: "/api/auth/oauth/token",
params: {
grant_type: 'refresh_token',
client_id: 'web_app',
client_secret: 'spring-microservice-exam-secret',
refresh_token: s,
},
headers: {
Authorization: basicAuthorization,
},
}).then((res) => {
if (res.status == 200) {
store.commit("ADDTOKEN", res.data.access_token);//赋值新token
//把token失效前发送失败的接口再次从发
var backoff = new Promise(resolve => {
resolve();
});
return backoff.then(function() {
return axios(r);//发送之前失败的接口请求
});
}
}).catch((error) => {
store.commit('LOGUT');
Message.error("登录超时,请退出重新登录!!!");
});
}
if (err && err.response && err.response.status === 500) {
Message.error("服务访问失败!");
}
// 对响应错误做点什么
return Promise.reject(err);
});