使用axios实现token刷新并重新发起请求

引言

在前后端分离的项目中,前端通常会使用axios来进行网络请求。在一些需要用户登录的场景下,服务端会返回一个access token用于验证用户身份。然而,access token有时效性,会在一段时间后过期,需要刷新token。本文将介绍如何通过axios实现token刷新并重新发起请求的功能。

什么是token刷新

Token刷新是指在token过期后,通过提供refresh token获取新的access token的过程。refresh token通常比access token的有效期更长,用于更新access token而无需用户重新登录。

使用axios实现token刷新

下面是一个示例的axios请求代码,其中使用了axios拦截器来实现token刷新的功能。

// 创建axios实例
const axiosInstance = axios.create({
  baseURL: '
  timeout: 5000
});

// 请求拦截器
axiosInstance.interceptors.request.use(
  config => {
    const accessToken = localStorage.getItem('accessToken');
    config.headers.Authorization = `Bearer ${accessToken}`;
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  response => {
    return response;
  },
  async error => {
    const originalRequest = error.config;
    if (error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const refreshToken = localStorage.getItem('refreshToken');
      try {
        const response = await axios.post('/refresh', { token: refreshToken });
        const newAccessToken = response.data.accessToken;
        localStorage.setItem('accessToken', newAccessToken);
        originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
        return axios(originalRequest);
      } catch (error) {
        return Promise.reject(error);
      }
    }
    return Promise.reject(error);
  }
);

在上面的代码中,我们通过请求拦截器和响应拦截器实现了token刷新的功能。当服务器返回401未授权错误时,我们会尝试使用refresh token来获取新的access token,并重新发起原始请求。

类图示例

下面是一个使用mermaid语法表示的axios请求类图示例:

classDiagram
    class Axios {
        <<axios>> +create(config)
    }
    class Interceptors {
        <<interceptor>> +request
        <<interceptor>> +response
    }
    class Request {
        <<request>> +url
        <<request>> +headers
    }
    class Response {
        <<response>> +status
        <<response>> +data
    }
    class Token {
        <<token>> +accessToken
        <<token>> +refreshToken
    }
    Axios --|> Interceptors
    Interceptors --|> Request
    Interceptors --|> Response
    Axios --> Token

以上是使用mermaid语法表示的axios请求类图示例,展示了axios、拦截器、请求、响应和token之间的关系。

结语

通过上述代码示例,我们了解了如何使用axios拦截器来实现token刷新并重新发起请求的功能。这种方法可以提高用户体验,避免因为token过期而导致用户需要重新登录。希望本文对你有所帮助,谢谢阅读!