vue的拦截器使用,和token失效后的刷新token,发送之前的失败请求

**

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);
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值