如何在Vue项目中使用axios拦截器实现token的自动刷新机制?请提供详细的实现步骤和代码。
时间: 2024-12-01 21:28:21 浏览: 3
在开发Vue应用时,处理用户登录状态和token刷新是常见需求。要实现这一功能,通常会用到axios的拦截器机制。通过拦截器,你可以在请求发送前或响应返回后执行特定的逻辑。以下是如何在Vue项目中实现axios拦截器自动刷新token的详细步骤和代码:
参考资源链接:[vue下axios拦截器token刷新机制的实例代码](https://wenku.csdn.net/doc/6401acb5cce7214c316ecd60?spm=1055.2569.3001.10343)
首先,你需要创建一个http.js文件,用于封装axios并配置拦截器:
```javascript
// 引入安装的axios插件
import axios from 'axios';
import router from '@/router';
import Vue from 'vue';
let _this = new Vue();
let isLock = false;
let refreshSubscribers = [];
// 判断token是否过期
function isTokenExpired(token) {
// 解析token中的过期时间,并与当前时间进行比较
let expires_time = JSON.parse(atob(token.split('.')[1])).exp;
return Math.floor(Date.now() / 1000) > expires_time;
}
// 创建axios实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // API的base_url
timeout: 5000 // 请求超时时间
});
// 请求拦截器
service.interceptors.request.use(
config => {
// 在发送请求之前做些什么
if (localStorage.getItem('token')) {
// 如果token存在,检查是否过期
if (isTokenExpired(localStorage.getItem('token'))) {
// 如果token过期,则需要刷新
if (!isLock) {
isLock = true;
// 发起刷新token的请求
// ...
// 刷新成功后,需要调用所有订阅者
refreshSubscribers.forEach(callback => callback());
}
} else {
// 如果token未过期,添加到请求头中
config.headers['Authorization'] = 'Bearer ' + localStorage.getItem('token');
}
}
return config;
},
error => {
// 对请求错误做些什么
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
response => {
// 对响应数据做点什么
return response;
},
error => {
// 对响应错误做点什么
if (error.response && error.response.status === 401) {
// 如果返回401,可能是token过期,可以在这里调用刷新token的逻辑
// ...
}
return Promise.reject(error);
}
);
export default service;
```
在上述代码中,我们创建了一个axios实例,并对其请求和响应进行了拦截。在请求拦截中,我们检查了token是否存在以及是否过期,如果过期则触发刷新逻辑。在响应拦截中,如果遇到401错误,也可以调用刷新逻辑。这样,你就可以在用户无感知的情况下,自动刷新过期的token。
为了更深入理解和掌握axios拦截器及相关概念,建议查看提供的资料《vue下axios拦截器token刷新机制的实例代码》。这份资源通过具体的代码实例,详细解释了axios拦截器的使用方法和token刷新机制的实现细节,是帮助你解决当前问题的理想参考。
参考资源链接:[vue下axios拦截器token刷新机制的实例代码](https://wenku.csdn.net/doc/6401acb5cce7214c316ecd60?spm=1055.2569.3001.10343)
阅读全文