这个如果refresh_token也过期了那就只能去登陆了,
直接上代码
import axios from 'axios';
import {getToken, setToken} from '@/libs/util'
const baseURL = 'http://localhost:8080/'
class HttpRequest {
constructor(baseUrl = baseURL) {
this.noAuthCode = 401
this.noAuthorizetionUrl = '/error_network';
this.mobileAuthorizeUrl = 'auth/getAuthUrl';
this.refreshTokenUrl = '/auth/refreshToken';
this.baseUrl = baseUrl;
this.reqQueue = [];
this.tokenExpired = false;
this.refreshTokenExpired = false;
}
request(options) {
const instance = axios.create();
options = {...this.getInsideConfig(), ...options};
this.interceptors(instance)
return instance(options)
}
getInsideConfig() {
const config = {
baseURL: this.baseUrl,
headers: {}
}
const token = getToken();
if (token && token.accessToken) config.headers['Authentic'] = token.accessToken;
return config;
}
interceptors(instance, uri) {
const {noAuthCode,refreshTokenUrl,refreshTokenExpired} = this
instance.interceptors.request.use(config => {
return config
}, error => {
return Promise.reject(error)
});
instance.interceptors.response.use(res => {
const {data} = res;
if (data.code === noAuthCode) {
const originalUrl = config.url.replace(config.baseURL, '');
return this.refreshToken(res, originalUrl);
}
this.destroy(uri);
return {data, status}
})
}
//这里是一个重点重发请求的重点
refreshToken(res, uri) {
const config = res.config;
if (!this.tokenExpired) {//js 是单线程的不用考虑这里的并发问题,这里也只会有一个请求进来
this.tokenExpired = true;
const token = getToken();
if (!token) return {};
this.request({url: this.refreshTokenUrl, method: 'get', params: {refreshToken: token.refreshToken}})
.then(({data}) => {
// 没有权限(没有合法token)就需要去赋权 (可以是账号密码登录,也可以是别的操纵让此用户有权限)
if (data.code === this.noAuthCode) {
this.reqQueue = [];
// 跳转到微信授权页面去授权 ,这里时第三方授权,需要授权后跳转到此页面来继续发起相应的请求
this.goToAuthorizePage(res)
} else {
const token = data.data;
setToken(token.accessToken, token.refreshToken);
this.onAccessTokenFetched(token.accessToken);
}
this.tokenExpired = false;
})
}
return new Promise((resolve) => {
let fn = (accessToken) => {
if (accessToken) {
config.url = uri;
config.headers['Authentic'] = accessToken;
resolve(this.request(config))
} else {
resolve(res)
}
}
this.addSubSubscriber(fn)
})
}
onAccessTokenFetched(newToken) {
if (!newToken) return
this.reqQueue.forEach(callBackFn => callBackFn());
this.reqQueue = []
}
goToAuthorizePage(config) {
const originalHref = window.location.href;
this.request({url: this.mobileAuthorizeUrl, method: 'get', params: {redirectUrl: originalHref}})
.then(res => {
if (res.status !== 200) {
//跳转到授权失败的页面
} else {
if (res.data.code === 1) {
//授权成功
this.refreshTokenExpired = false;
}
}
})
}
addSubSubscriber(fn) {
this.reqQueue.push(fn)
}
destroy(uri) {
}
}