修正刷新令牌API调用条件:实现每60分钟自动调用
问题分析与修正方案
原代码问题
- 逻辑判断完全错误:原条件
expires_in * 1000 > Date.now() + 3600000的逻辑不符合“每60分钟刷新一次”的需求,且数值对比逻辑颠倒,导致页面重载时误触发刷新。 - 缺少刷新时间跟踪:没有记录上次调用刷新令牌API的时间,无法通过时间间隔判断是否需要触发刷新。
修正后的实现代码
要实现每60分钟调用一次刷新令牌API,核心是跟踪上次刷新的时间点,并在页面重载时检查时间间隔。以下是基于localStorage持久化的方案(避免页面重载后丢失时间记录):
// 从localStorage获取上次刷新时间,无记录则初始化为0 const lastRefreshTime = parseInt(localStorage.getItem('lastRefreshTime')) || 0; const refreshInterval = 3600000; // 60分钟对应的毫秒数 const expires_in = 3600; // 来自认证API的令牌有效期(秒) if (refreshToken && Date.now() - lastRefreshTime > refreshInterval) { // 执行刷新令牌函数(替换为实际API调用逻辑) function refreshTokenFunction() { return fetch('/api/refresh-token', { method: 'POST', body: JSON.stringify({ refreshToken }) }).then(res => res.json()); } refreshTokenFunction().then(() => { // 刷新成功后,更新上次刷新时间为当前时间 localStorage.setItem('lastRefreshTime', Date.now().toString()); }).catch(err => { console.error('刷新令牌失败:', err); }); } else { console.log("未到刷新时间,或无有效refreshToken"); }
关键说明
- 持久化时间记录:用
localStorage存储lastRefreshTime,确保页面关闭或重载后仍能读取到上次刷新的时间点。 - 正确的时间间隔判断:通过
Date.now() - lastRefreshTime > refreshInterval检查距离上次刷新是否已超过60分钟。 - 刷新后更新时间:必须在刷新令牌成功后更新
lastRefreshTime,否则下次页面重载仍会重复触发刷新。 - 可选方案:如果仅需在当前会话内维持刷新间隔,可改用全局变量或状态管理工具(如React/Vue的状态)存储
lastRefreshTime,但页面重载后会重置时间记录。
内容的提问来源于stack exchange,提问作者Waqas Ahmed
相关产品推荐
相关产品推荐

