vue下axios拦截器token刷新机制的实例代码

2020-06-16 06:40:40易采站长站整理

let token = getToken();
if (token) {
//判断token是否过期,如果过期请求刷新token
if (isTokenExpired(token)) {
//判断当前是否正在请求刷新token
if (!isLock) {
isLock = true;//isLock设置true,锁住防止死循环。
//使用Promise等待刷新完成返回配置信息
let refresh = new Promise((resolve, reject) => {
refreshToken(config, token, resolve, reject);
})
return refresh;

} else {
//判断当前url是否是刷新token的请求地址,如果是直接下一步。
if (config.url.indexOf('/logined/refreshToken') === -1) {
//把请求(token)=>{....}都push到一个数组中
let retry = new Promise((resolve, reject) => {
//(token) => {...}这个函数就是回调函数
subscribeTokenRefresh((token) => {
config.headers.Authorization = 'Bearer ' + token
//将请求挂起
resolve(config)
})
})
return retry

} else {
return config;
}
}

} else {
return config;
}

} else {
return config;
}
}, error => {
return Promise.reject(error);
});
const http = options => {
return new Promise((resolve, reject) => {
const defaultOptions = {
type: "json"
};
const newOptions = {
...defaultOptions,
...options
};
//headers默认传递json格式数据,这里也可以设置token,每次调用都会携带
if (localStorage.getItem("token")) {
newOptions.headers = {
// 'Authorization': 'Basic b3JkZXItc2VydmVyOjEyMzQ1Ng==',
'content-Type': newOptions.type == 'form' ? 'application/x-www-form-urlencoded;charset=UTF-8' : 'application/json;charset=UTF-8',
'Authorization': 'Bearer ' + JSON.parse(localStorage.getItem("token")).access_token,
...newOptions.headers
};
} else {
newOptions.headers = {
'content-Type': newOptions.type == 'form' ? 'application/x-www-form-urlencoded;charset=UTF-8' : 'application/json;charset=UTF-8',
...newOptions.headers
};
}
request(newOptions, resolve, reject);
})
};

//设置请求超时
axios.defaults.timeout = 30000
export default http

//在main.js下面挂载 http.js文件
import http from '@/utils/http.js';
Vue.prototype.http = http;

//登录保存token信息接口

this.http({
method: "post",
url: "/xxxxx/user",
type: "form",
headers: { Authorization:"Basicb3JkZXItc2VydmVyOjEyMzQ1Ng==" },
data: {}
}).then(function(res) {
let expires_time =
new Date().getTime() +
parseInt(res.data.token.expires_in * 0.8) * 1000;
let token = res.data.token;
token.expires_time = expires_time;