import axios from 'axios';
import qs from 'qs';
import router, {
resetRouter
} from '../router';
import {
Loading,
Message
} from 'element-ui';
import * as local from '@/utils/localStorage.js';
// 接口请求个数
let requestCount = 0;
// 是否正在刷新token
let isRefreshing = false;
// 重新请求的接口
let requests = [];
let loading;
function showFullScreenLoading () {
if (requestCount === 0) {
loading = Loading.service({
lock: true,
text: '加载中……',
background: 'rgba(0, 0, 0, 0.7)'
});
}
requestCount++;
}
function tryHideFullScreenLoading () {
if (requestCount <= 0) return;
requestCount--;
if (requestCount === 0) {
loading.close();
}
}
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 10000
});
// 换取新的token值
export function refreshToken (data) {
return service({
//填写换取新access_token的地址
url: 'oauth/token',
//method,data,auth等参数的值根据自己接口来定
method: 'post',
data: qs.stringify(data),
auth: {
username: '',
password: ''
}
});
}
service.interceptors.request.use(function (config) {
// 在发送请求之前获取token是否存在
var token = local.getToken();
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
//显示loading
showFullScreenLoading();
return config;
}, function (error) {
// 抛出错误
return Promise.reject(error);
});
service.interceptors.response.use(function (response) {
//关闭loading
tryHideFullScreenLoading();
return response;
}, function (error) {
if (error.message.includes('timeout')) {
if (!window.timeoutTip) {
Message.error('连接超时');
window.timeoutTip = 1;
}
}
if (error && error.response) {
//判断当前是否换取token的接口
if (error.response.status === 401 && error.response.config.url.indexOf('oauth/token') < 0) {
const config = error.response.config;
if (!isRefreshing) {
isRefreshing = true;
const refreshData = {
grant_type: 'refresh_token',
refresh_token: local.getRefreshToken()
};
return refreshToken(refreshData).then(res => {
if (res.status === 200) {
local.setToken(res.data.access_token);
local.setRefreshToken(res.data.refresh_token);
// 重置配置
config.headers.Authorization = 'Bearer ' + res.data.access_token;
requests.forEach(cb => cb(res.data.access_token));
requests = [];
isRefreshing = false;
tryHideFullScreenLoading();
return service(config);
}
}).catch(() => {
Message.error('您的登录已经超时或者在另一个设备登录,您被迫下线');
local.clearLocalStorage();
//因为项目有账号权限,需要重置路由
resetRouter();
router.push({
path: '/login'
});
isRefreshing = false;
tryHideFullScreenLoading();
});
} else {
return new Promise((resolve) => {
// 将resolve放进队列,用函数保存,token刷新后执行
requests.push((token) => {
config.headers.Authorization = 'Bearer ' + token;
resolve(service(config));
});
tryHideFullScreenLoading();
});
}
}
}
tryHideFullScreenLoading();
return Promise.reject(error);
});
export default service;
文章仅供参考,欢迎各位大神提意见