如何在Vue项目中使用axios拦截器实现token的自动刷新机制?请提供详细的实现步骤和代码。
时间: 2024-12-03 18:36:58 浏览: 18
在Vue项目中实现token的自动刷新机制,可以通过axios的拦截器功能来完成。该机制确保了在发送请求时,如果token即将过期或已经过期,能够自动刷新token并重新发送请求。以下是一个详细的实现步骤和代码示例:
参考资源链接:[vue下axios拦截器token刷新机制的实例代码](https://wenku.csdn.net/doc/6401acb5cce7214c316ecd60?spm=1055.2569.3001.10343)
首先,你需要在你的项目中安装并引入axios库。然后,创建一个http.js文件,用于封装axios实例,并设置请求拦截器来添加token到请求头中,以及响应拦截器来处理token刷新。
```javascript
import axios from 'axios';
import router from '@/router';
import Vue from 'vue';
import store from '@/store'; // 假设你有一个store来管理状态
// 创建axios实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // api的base_url
timeout: 5000 // 请求超时时间
});
// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) { // 判断是否存在token
if (isTokenExpired(store.getters.token)) { // 判断token是否过期
// 这里需要调用刷新token的函数,并订阅刷新成功后的回调
refreshAccessToken().then(newToken => {
***mit('SET_TOKEN', newToken); // 更新store中的token
config.headers['Authorization'] = `Bearer ${newToken}`; // 重新设置请求头中的token
}).catch(err => {
// token刷新失败,可以选择跳转到登录页或通知用户
if (err instanceof Error) {
console.error(err.message);
}
Vue.prototype.$message.error('登录信息已过期,请重新登录');
store.dispatch('LogOut').then(() => {
router.push('/login'); // 跳转到登录页面
});
});
return Promise.reject('Token is expired or invalid, please refresh it first.');
} else {
// 如果token未过期,则正常添加到请求头
config.headers['Authorization'] = `Bearer ${store.getters.token}`;
}
}
return config;
},
error => {
// 对请求错误做些什么
console.log(error); // for debug
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
response => {
const res = response.data;
// 如果返回的状态码为200,则认为接口请求成功,否则抛出错误
if (res.code !== 200) {
Vue.prototype.$message.error(res.msg || 'Error');
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// 销毁token并提示用户登录
store.dispatch('LogOut').then(() => {
location.reload(); // 重新实例化vue实例,避免登录态污染
});
}
return Promise.reject(new Error(res.msg || 'Error'));
} else {
return res;
}
},
error => {
console.log('err' + error); // for debug
return Promise.reject(error);
}
);
// 导出axios实例
export default service;
// 以下是一个假设的token刷新函数示例
function refreshAccessToken() {
// 这里应该是调用后端API刷新token的逻辑
// 返回新的token
return new Promise((resolve, reject) => {
// 模拟异步操作
setTimeout(() => {
resolve('new refreshed token');
}, 2000);
});
}
```
在上述代码中,我们创建了一个axios实例,并在请求拦截器中检查token是否存在和是否过期。如果token过期,我们通过调用`refreshAccessToken`函数来刷新token,并在成功刷新后重新发送请求。
为了获得更深入的理解,建议查看《vue下axios拦截器token刷新机制的实例代码》。这份资源将带你了解如何在Vue项目中处理token刷新问题,提供实际的代码示例,并帮助你构建更安全和稳定的HTTP请求处理逻辑。通过学习这些实例代码,你可以更好地掌握在Vue中使用axios进行API请求的高级技巧,包括如何有效地管理token,以及如何处理各种网络请求中可能遇到的问题。
参考资源链接:[vue下axios拦截器token刷新机制的实例代码](https://wenku.csdn.net/doc/6401acb5cce7214c316ecd60?spm=1055.2569.3001.10343)
阅读全文