实现“axios 401 去登录 记录当前路由”流程

前言

在前端开发中,经常会遇到需要处理用户登录状态的场景。当用户未登录或登录信息过期时,我们通常需要跳转到登录页,并在登录成功后返回原页面。本篇文章将教会你如何使用axios拦截器处理401错误,自动跳转到登录页并记录当前路由。

整体流程

步骤 描述
1 创建axios实例,并设置拦截器
2 定义一个全局变量记录当前路由
3 在路由跳转前,将当前路由存储到全局变量中
4 在拦截器中判断错误状态码,如果为401则跳转至登录页
5 在登录成功后,获取全局变量中的当前路由,并跳转至该路由

代码实现

第一步:创建axios实例,并设置拦截器

// 导入axios库
import axios from 'axios';

// 创建axios实例
const instance = axios.create({
  // 设置基本的请求配置,如请求超时时间等
  timeout: 5000,
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在请求发送之前做一些处理,例如添加请求头等
    return config;
  },
  (error) => {
    // 对请求错误做处理
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做处理
    return response;
  },
  (error) => {
    // 对响应错误做处理
    return Promise.reject(error);
  }
);

export default instance;

第二步:定义一个全局变量记录当前路由

// 在main.js或者入口文件中定义一个全局变量
window.currentRoute = null;

第三步:在路由跳转前,将当前路由存储到全局变量中

// 在路由跳转前的钩子函数中,将当前路由存储到全局变量中
router.beforeEach((to, from, next) => {
  // 将当前路由存储到全局变量中
  window.currentRoute = to;
  next();
});

第四步:在拦截器中判断错误状态码,如果为401则跳转至登录页

// 在响应拦截器中判断错误状态码
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做处理
    return response;
  },
  (error) => {
    // 判断错误状态码是否为401
    if (error.response && error.response.status === 401) {
      // 跳转至登录页
      router.push('/login');
    }
    return Promise.reject(error);
  }
);

第五步:在登录成功后,获取全局变量中的当前路由,并跳转至该路由

// 在登录成功后的回调函数中,获取全局变量中的当前路由,并跳转至该路由
loginSuccessCallback() {
  // 获取全局变量中的当前路由
  const currentRoute = window.currentRoute;
  if (currentRoute) {
    // 跳转至当前路由
    router.push(currentRoute);
  } else {
    // 跳转至默认页面
    router.push('/');
  }
}

总结

通过以上步骤,我们成功实现了使用axios拦截器处理401错误,自动跳转到登录页并记录当前路由的功能。在开发中,可以根据实际情况对拦截器进行扩展,例如添加token刷新机制等。希望本文能帮助到你,欢迎提出意见和建议,共同进步!