第三十五节:Axios 统一错误拦截、401 Token 过期处理

第三十五节:Axios 统一错误拦截、401 Token 过期处理

目标:统一处理后端返回错误码,全局消息提示;401 时清除 pinia 用户状态、跳转到登录页,实现 token 过期自动登出。

1、改造 src/utils/request.js(axios 二次封装)

复制代码
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000
})

// 请求拦截器:带上token
service.interceptors.request.use(config => {
  const userStore = useUserStore()
  if(userStore.token){
    config.headers.Authorization = `Bearer ${userStore.token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

// 响应拦截器:统一处理返回码
service.interceptors.response.use(
  response => {
    const res = response.data
    //业务码200代表正常
    if(res.code !== 200){
      ElMessage.error(res.msg || '请求失败')
      return Promise.reject(new Error(res.msg || 'Error'))
    }
    return res
  },
  error => {
    // http状态码错误处理
    const userStore = useUserStore()
    if(error.response){
      const status = error.response.status
      switch(status){
        case 401:
          ElMessage.warning('登录已过期,请重新登录')
          //清空token、用户信息
          userStore.logout()
          //跳转到登录页
          location.href = '/login'
          break
        case 403:
          ElMessage.error('没有权限访问该资源')
          break
        case 404:
          ElMessage.error('请求接口不存在')
          break
        case 500:
          ElMessage.error('服务器内部错误')
          break
        default:
          ElMessage.error(error.message || '网络异常')
      }
    }else{
      ElMessage.error('网络连接失败,请检查网络')
    }
    return Promise.reject(error)
  }
)

export default service

2、完善 user 仓库 logout 方法 src/stores/user.js

补充 logout,清除 token、用户信息

复制代码
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user',{
  state:()=>{
    return {
      token:'',
      username:'',
      roles:[]
    }
  },
  actions:{
    setToken(token){
      this.token = token
    },
    setUserInfo(info){
      this.username = info.username
      this.roles = info.roles
    },
    //退出登录、清空状态
    logout(){
      this.token = ''
      this.username = ''
      this.roles = []
    }
  },
  persist:true
})

3、mock 模拟 401 测试(可选)

在 mock 接口中,返回 http 状态 401,即可触发过期逻辑:

复制代码
'/api/getUserInfo': ({headers})=>{
  //简单模拟token失效
  if(!headers.authorization){
    return { code:401, msg:'token失效' }
  }
  return {
    code:200,
    data:{ username:'admin', roles:['admin'] }
  }
}

测试流程

  1. 正常请求接口,后端返回 code 非 200,页面自动弹出错误提示。
  2. 触发 401 状态码:弹出提示,清空 pinia 存储,页面自动跳转到登录页面。
  3. 403/404/500 不同错误,分别弹出对应提示消息。
相关推荐
雪芽蓝域zzs2 小时前
Vue导入方法三种方式对比
前端·javascript·vue.js
定栓3 小时前
Webpack迁到Vite第八节:错误排查实录
前端·webpack·devops
haluhalu.3 小时前
深入理解 AI Agent(1.2):Harness 工程——模型之外的竞争力
前端·数据结构·人工智能·python·langchain·个人开发
data analyse 4563 小时前
服务端统计时区切换的日期归并
大数据·前端·数据库·人工智能·数据分析
misty youth3 小时前
前端知识速查
前端·react.js·web
雪芽蓝域zzs3 小时前
从零搭建【pnpm+Vue3+TS+Setup+VueRouter4+Pinia+Axios+ElementPlus (unplugin 按需)】仿若依后台
前端·vue.js
燕落南枝4 小时前
HTML 列表标签详解:有序列表、无序列表与描述列表
前端·html
派小心.4 小时前
DAU和MAU怎么计算?先确定活跃事件、用户键和统计窗口
大数据·服务器·前端·人工智能·数据分析
代码猎人4 小时前
前端怎么配合后端完成bug修复
前端
叫我铁汁儿吧4 小时前
JS作用域
前端·面试