token过期 无感刷新

1、request.js

import axios from 'axios'
import { setToken,setRefreshToken,getToken } from './token'
import { refreshToken,isRefreshRequest } from './refreshToken'
const ins = axios.create({
	baseURL:'http://localhost:9527',
	headers:{
		Authorization:`Bearer ${getToken()}`
	}
})

ins.interceptors.response.use(async (res) => {
	// 响应结果里面有token 就把它保存起来
	if(res.headers.authorization){
		const token = res.headers.authorization.replace('Bearer','');
		setToken(token);
		ins.defaults.headers.Authorization = `Bearer ${token}`
	}
	// 响应结果里面有刷新token 也把它保存起来
	if(res.headers.refreshtoken){
		const refreshtoken = res.headers.refreshtoken.replace('Bearer','')
		setRefreshToken(refreshtoken);
	}
	// 没有权限,刷新token
	// 需要判断是否是refreshToken 如果刷新token也过期并且走这里,就会进入401死循环
	if(res.data.code === 401 && !isRefreshRequest(res.config)){
		// 刷新token
		const isSuccess = await refreshToken()
		// 判断刷新token是否成功
		is(isSuccess){
		// 保存新的token 
		res.config.headers.Authorization = `Bearer ${getToken()}`
		// 有新的token后,重新请求
		const resp = await ins.request(res.config)
		return resp;
		} else {
			// 刷新失败,跳转到登录页
			console.log(`跳转到登录页`)
		}
	}
	return res.data;
})
export default ins;

2、index.js

import request from './request';
// 登录
export function login(){
	return request.post('/login')
}
// 请求受保护的资源
export function reqProtected() {
	return request.post('/protected')
}

export * from './refreshToken'

3.refreshToken.js

优化点:如果同时发出很多个请求,都失败了,都要重新去刷新token,就会导致refreshToken()在某一个时间点,并发执行很多次

import { getRefreshToken } from './token'
// 1、第一次刷新token的时候创建了一个promise
let promise;

export  function refreshToken() {
	// 2、有值就直接返回
	if(promise){
		return promise;
	}
	// 3、没有值就直接赋值
	promise = new Promise(async (resolve,reject) => {
	const resp = await  request.get('/refresh_token',{
		headers:{
		 	Authorization:`Bearer ${getRefreshToken()}`
		},
		__isRefreshtoken:true
	});
	resolve(resp.code === 0);
	})
	promise.finally(()=>{
		promise = null;
	})
		return promise;
}

 

// 把请求配置config传过去,看配置里面是否有这样一个属性 有的话就是一个刷新token的请求
export function isRefreshRequest(config){
	return !!config.__isRefreshToken; // 两个取反把它变成布尔值
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值