当 Token 过期时,前端可以使用以下两种无感刷新 Token 的方案:
1. 使用刷新Token(Refresh Token)
在登录成功后,后端会返回两个Token,一个是Access Token,一个是Refresh Token。前端需要将这两个Token保存到本地存储中,例如localStorage或sessionStorage中,以便在需要时使用。
当需要访问API时,前端将从本地存储中获取Access Token,并将其放入请求头中发送到后端。如果Access Token过期了,后端会返回一个错误响应,并提示前端进行刷新Token的操作。
前端可以使用下面的代码实现刷新Token的操作:
function refreshToken() {
const refreshToken = localStorage.getItem('refreshToken');
// 发送请求到后端,获取新的Access Token
fetch('/api/refreshToken', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ refreshToken })
})
.then(response => response.json())
.then(data => {
// 将新的Access Token更新到本地存储中
localStorage.setItem('accessToken', data.accessToken);
})
.catch(error => {
console.error('刷新Token失败:', error);
});
}
当需要刷新Token时,前端可以调用refreshToken函数,该函数会向后端发送请求,获取新的Access Token,并将其更新到本地存储中。在使用API时,前端需要检查Access Token是否过期,如果过期了,则需要调用refreshToken函数来获取新的Access Token。
2. 使用续期接口
在登录成功后,后端会返回一个Access Token和一个过期时间。前端可以将Access Token和过期时间保存到本地存储中,以便在需要时使用。
前端需要定时检查Access Token是否过期,如果过期了,则需要向后端发送续期请求来更新Access Token的过期时间。下面是一个示例代码:
function renewToken() {
const accessToken = localStorage.getItem('accessToken');
const expireTime = localStorage.getItem('expireTime');
// 计算AccessToken的剩余有效时间
const remainTime = expireTime - Date.now();
// 如果AccessToken的剩余有效时间小于5分钟,则发送续期请求
if (remainTime < 5 * 60 * 1000) {
// 发送续期请求到后端,更新AccessToken的过期时间
fetch('/api/renewToken', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ accessToken })
})
.then(response => response.json())
.then(data => {
// 将新的过期时间更新到本地存储中
localStorage.setItem('expireTime', data.expireTime);
})
.catch(error => {
console.error('续期Token失败:', error);
});
}
}
// 定时检查AccessToken的过期时间
setInterval(renewToken, 60 * 1000);
上面的代码中,renewToken函数会检查Access Token的过期时间,如果剩余有效时间小于5分钟,则会向后端发送续期请求来更新AccessToken的过期时间。在使用API时,前端需要定时调用renewToken函数来检查Access Token的过期时间,并更新过期时间。