实现Vue Axios自动续签JWT
1. 引言
在Vue开发中,经常需要与服务器进行通信获取数据。而在使用JWT(Json Web Token)进行身份验证时,我们需要在每次请求中附带有效的JWT令牌。为了简化这个过程,我们可以使用Axios拦截器来自动续签JWT,并将其应用于整个项目。
本文将介绍如何在Vue项目中实现Vue Axios自动续签JWT的功能。我们将首先了解整个流程,并提供具体的代码示例。
2. 流程概述
实现Vue Axios自动续签JWT的流程可以分为以下几个步骤:
步骤 | 描述 |
---|---|
1 | 创建Axios实例 |
2 | 添加请求拦截器 |
3 | 添加响应拦截器 |
4 | 实现JWT续签功能 |
下面我们将逐步介绍每个步骤需要做什么,并提供相应的代码示例。
3. 创建Axios实例
首先,在Vue项目中创建一个Axios实例,用于进行所有的HTTP请求。可以在项目的main.js
中添加以下代码:
import axios from 'axios';
const api = axios.create({
baseURL: ' // 设置基本URL
timeout: 5000, // 设置超时时间
});
export default api;
在上述代码中,我们通过axios.create()
方法创建了一个名为api
的Axios实例,并设置了基本URL和超时时间。你可以根据实际情况进行调整。
4. 添加请求拦截器
接下来,我们需要添加一个请求拦截器,在每次请求之前检查JWT令牌是否过期。如果JWT令牌过期,则需要进行续签操作。可以在上一步创建的api
实例中添加以下代码:
api.interceptors.request.use((config) => {
const token = localStorage.getItem('jwtToken'); // 获取JWT令牌
if (token) {
const decodedToken = parseJwt(token);
const currentTime = Math.floor(Date.now() / 1000);
if (decodedToken.exp < currentTime) {
// JWT令牌过期,进行续签操作
return renewToken(config);
}
}
return config;
}, (error) => {
return Promise.reject(error);
});
上述代码中,我们使用api.interceptors.request.use()
方法添加了一个请求拦截器。拦截器会在每次请求之前执行,并传入config
对象。
在拦截器中,我们首先通过localStorage.getItem('jwtToken')
获取存储在本地的JWT令牌。然后,我们通过parseJwt(token)
函数解析JWT令牌,获取其过期时间。
接下来,我们获取当前时间currentTime
,并将其与JWT令牌的过期时间进行比较。如果JWT令牌已过期,则调用renewToken(config)
函数进行续签操作。
最后,我们返回config
对象,继续进行正常的请求。
5. 添加响应拦截器
除了请求拦截器,我们还需要添加一个响应拦截器,用于处理服务器返回的响应结果。可以在上一步创建的api
实例中添加以下代码:
api.interceptors.response.use((response) => {
return response;
}, (error) => {
if (error.response.status === 401) {
// JWT令牌无效或已过期,跳转到登录页面
redirectToLogin();
}
return Promise.reject(error);
});
在上述代码中,我们使用api.interceptors.response.use()
方法添加了一个响应拦截器。拦截器会在每次请求完成后执行,并传入response
对象。
在拦截器中,我们首先检查服务器返回的响应状态码。如果状态码为401(表示未授权),则说明JWT令牌无效或已过期。在这种情况下,我们可以调用redirectToLogin()
函数跳转到登录页面。
最后,我们返回response
对象,继续进行正常的响应处理。
6. 实现JWT续签功能
最后,我们需要实现JWT