面试官:说说前端怎么无感刷新token?

6,803 阅读2分钟

当 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的过期时间,并更新过期时间。