在前端开发中,实现无感刷新token通常涉及以下几个步骤:
-
设置拦截器:
使用前端框架(如Axios、Fetch API等)时,你可以设置一个请求拦截器。这个拦截器会在每个请求被发送之前执行。在拦截器中,你可以检查token的有效性和过期时间。
-
检查Token有效性:
在请求拦截器中,检查当前存储的token是否过期或即将过期。这通常涉及解析token中的过期时间(如果token是JWT类型的话)并与当前时间进行比较。
-
自动刷新Token:
如果检测到token过期或即将过期,可以自动发起一个请求到后端服务来刷新token。这个请求通常需要使用之前保存的refresh token或者其他认证信息。
-
替换Token并重新发送原始请求:
一旦从后端服务获得新的token,更新本地存储的token信息,并用新的token替换原始请求头中的旧token。然后重新发送原始请求。
-
处理刷新失败的情况:
如果刷新token的请求失败,可能需要将用户重定向到登录页面或执行其他适当的错误处理逻辑。
-
设置定时器或监听事件以提前刷新:
为了避免在每次请求时都检查token,你也可以设置一个定时器或者监听某些事件(比如用户重新变得活跃时),以便在token过期前的某个时间点自动刷新它。
以下是一个简化的示例流程(以Axios和JWT为例):
axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {// 检查token是否过期(假设你的JWT包含过期时间信息)const decoded = jwt_decode(token);if (decoded.exp * 1000 < Date.now()) {// Token已过期,需要刷新return axios.post('/api/refresh', { refreshToken: localStorage.getItem('refreshToken') }).then(response => {localStorage.setItem('token', response.data.token);localStorage.setItem('refreshToken', response.data.refreshToken);// 使用新token更新请求头config.headers.Authorization = 'Bearer ' + response.data.token;return config;}).catch(error => {// 处理刷新失败的情况,例如重定向到登录页面window.location.href = '/login';});} else {// Token未过期,正常使用config.headers.Authorization = 'Bearer ' + token;return config;}} else {// 没有Token,可能需要重定向到登录页面或其他处理window.location.href = '/login';}
}, error => {return Promise.reject(error);
});
注意:这个示例仅用于说明目的,并可能需要根据你的具体应用场景进行调整。务必确保你的后端API支持刷新token的机制,并且前端和后端在token和refresh token的处理上保持一致。