Vue 3 项目中的拦截器的作用和写法(动态设置响应头适配表单文件上传)

在 Vue 3 项目中,拦截器(Interceptors)主要指 Axios 拦截器,它充当了前端应用与后端服务器之间的一个中间件层。其核心作用是在请求发送前或响应接收后,对数据进行统一拦截和处理。

具体来说,Vue 3 项目中的拦截器主要有以下四大核心作用:

1. 请求拦截器(Request Interceptor)

在请求发送到服务器之前进行统一处理,避免在每个业务接口中重复编写相同的逻辑:

  • 身份验证与授权 :自动从本地存储(如 localStorage)读取 Token,并添加到每个请求的 Header 中,确保用户处于登录状态。
  • 全局配置注入:统一设置请求超时时间、Content-Type 格式,或添加特定的公共请求参数。
  • 全局 Loading 状态:在请求发出时触发全局的加载动画(Loading),提示用户正在获取数据。
  • 数据预处理:对敏感请求参数进行加密处理,或格式化请求数据结构。

2. 响应拦截器(Response Interceptor)

在接收到服务器响应之后 、业务代码处理数据之前进行统一处理:

  • 统一数据格式化 :剥离响应中无用的外层包装(如 {code: 200, msg: 'ok', data: {...}}),直接提取 data 返回给业务组件,简化业务代码。
  • 全局 Loading 关闭:请求完成后,自动关闭之前开启的加载动画。
  • 业务状态码处理 :根据后端返回的自定义状态码(如 code != 200)进行统一拦截,例如提示错误信息或执行特定的业务逻辑。

3. 全局错误处理

拦截器可以捕获网络请求中出现的各类异常,并进行统一的兜底处理,大幅提升用户体验和代码的健壮性:

  • HTTP 状态码处理 :例如捕获 401 Unauthorized 状态码,自动清除本地 Token 并重定向到登录页面;捕获 403 提示权限不足;捕获 500 提示服务器异常。
  • 网络异常处理:处理断网、请求超时等网络错误,给出友好的全局 Toast 提示。

4. 提升代码质量与可维护性

  • 消除冗余代码:将鉴权、错误提示、数据格式化等通用逻辑从具体的业务组件中抽离出来,使得组件代码更加纯粹和简洁。
  • 增强复用性:只需在 Axios 实例中配置一次拦截器,整个 Vue 3 项目中的所有接口请求都会自动生效,极大地提高了开发效率和代码的可维护性。

补充说明:除了 Axios 拦截器,Vue 3 项目中还有 Vue Router 导航守卫(Navigation Guards)。它主要用于拦截页面的路由跳转,常用于页面级别的权限验证(如未登录禁止访问后台页面)、页面标题设置或数据预加载等。两者结合使用,可以构建非常完善的前端安全与交互体系。

下面是一个拦截器的例子:

src/api/request.js

js 复制代码
import axios from 'axios'
// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 公共基础地址
  timeout: 10000, // 请求超时时间 10秒
})

// 请求拦截器:发请求之前做处理,比如携带token
service.interceptors.request.use(
config => {
  // 动态判断:只有不是FormData,才设置json头
  if (!(config.data instanceof FormData)) {
    config.headers['Content-Type'] = 'application/json;charset=utf-8'
  }
  // 示例:如果本地有token,放到请求头
  // const token = localStorage.getItem('token')
  // if(token) config.headers.Authorization = `Bearer ${token}`
  return config
},
error => {
  return Promise.reject(error)
}
)

// 响应拦截器:拿到后端返回统一处理
service.interceptors.response.use(
response => {
  // 直接返回data,组件不用每次写 resp.data
  return response.data
},
error => {
  // 统一错误处理:打印错误、弹窗提示等
  console.error('请求异常:', error)
  // http状态码判断
  if (error.response) {
    switch (error.response.status) {
      case 401:
        console.log('未授权,请登录')
        break
      case 404:
        console.log('接口地址不存在')
        break
      case 500:
        console.log('服务器内部错误')
        break
    }
  }
  return Promise.reject(error)
}
)

export default service
相关推荐
叼烟扛炮1 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
IT_陈寒3 小时前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev3 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
陈随易4 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
笃行35012 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核
前端
陈随易13 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
ZhengEnCi14 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学
前端·css·交互设计
IT_陈寒17 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
用户27050777252417 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法
前端
用户4993350250717 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现
前端