import externalaxios from 'axios';
import { externalApi } from '@/common/js/api';
import {Message} from 'element-ui';
// externalaxios.defaults.timeout = 30000;
// externalaxios.defaults.baseURL = '';
// ****************************************************************************************
function getLocalToken () {
const token = window.sessionStorage.getItem('externalLogintoken')
return token
}
// ****************************************************************************************over
const service = externalaxios.create({
baseURL: '',
headers: {
'Content-Type': 'application/json',
'token': getLocalToken() // headers塞token
},
})
service.setToken = (token) => {
service.defaults.headers['token'] = token
window.sessionStorage.setItem('externalLogintoken', token)
}
//http request 拦截器
service.interceptors.request.use( config => {
if(sessionStorage.getItem("externalLogintoken")){
var token = sessionStorage.getItem("externalLogintoken");
}else{
var token = null;
}
// config.data = JSON.stringify(config.data);
config.headers = Object.assign({
'Content-Type': 'application/json;charset=UTF-8',
'token': token,
}, config.headers);
return config;
},
error => {
return Promise.reject(err);
}
);
//http response 拦截器
// 是否正在刷新的标记
let isRefreshing = false
// 重试队列,每一项将是一个待执行的函数形式
let requests = []
service.interceptors.response.use(response => {
const { code } = response.data
if (code == 401) {
sessionStorage.removeItem("externalLogintoken");
const config = response.config
if (!isRefreshing) {
isRefreshing = true
return refreshToken().then(res => {
service.setToken(res.token)
const { token } = res.token
config.headers['token'] = res.token
window.sessionStorage.setItem('externalLogintoken', res.token)
config.baseURL = ''
// 已经刷新了token,将所有队列中的请求进行重试
requests.forEach(cb => cb(token))
requests = []
return service(config)
}).catch(res => {
console.error('refreshtoken error =>', res)
//window.location.href = '/'
}).finally(() => {
isRefreshing = false
})
}
else {
// 正在刷新token,将返回一个未执行resolve的promise
return new Promise((resolve) => {
// 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
requests.push((token) => {
config.baseURL = ''
config.headers['token'] = sessionStorage.getItem("externalLogintoken")
resolve(service(config))
})
})
}
} else if (code == 70101) {
// token 获取失败
Message({
message: "授权失败,请稍后重试",
type: "error",
duration: 5 * 1000
});
requests = []
}
return response;
},
error => {
return Promise.reject(error)
}
)
export default service;
/**
* 封装get方法
* @param url
* @param data
* @returns {Promise}
*/
export function externalget(url, params = {}) {
return new Promise((resolve, reject) => {
service.get(url, {params: params})
.then(response => {
if(response){
resolve(response.data);
}else{
resolve(null);
}
})
.catch(err => {
reject(err)
})
})
}
export function externalpost(url, data = {}) {
return new Promise((resolve, reject) => {
service.post(url, data)
.then(response => {
if(response){
resolve(response.data);
}else{
resolve(null);
}
}, err => {
reject(err)
})
})
}
/**
* 封装patch请求
* @param url
* @param data
* @returns {Promise}
*/
export function patch(url, data = {}) {
return new Promise((resolve, reject) => {
externalaxios.patch(url, data)
.then(response => {
resolve(response.data);
}, err => {
reject(err)
})
})
}
/**
* 封装put请求
* @param url
* @param data
* @returns {Promise}
*/
export function put(url, data = {}) {
return new Promise((resolve, reject) => {
externalaxios.put(url, data)
.then(response => {
resolve(response.data);
}, err => {
reject(err)
})
})
}
/**
* 封装delete方法
* @param url
* @param data
* @returns {Promise}
*/
export function deletes(url, params = {}) {
return new Promise((resolve, reject) => {
externalaxios.delete(url, {
params: params
})
.then(response => {
resolve(response.data);
})
.catch(err => {
reject(err)
})
})
}
function refreshToken (){
return externalApi.externalToken().then(res => res.data)
}
token失效后重新获取
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Rxjava2+Retrofit2优雅实现token验证失败重新获取token然后重新请求该接口 公司的接口请求都...
- 1、request.js文件 2、lib.js文件 3、参考连接[https://segmentfault.com...
- 封装接口请求,我们的业务需要在header上加token和openid,可以根据自己的业务逻辑进行项目改变。 获取...
- 一般前台和后台交互会用到token,token有一定的时效性,过期之后需要客户端重新请求新的token。一般tok...