当前位置:首页 > VUE

vue实现过期接口拦截

2026-02-22 15:57:39VUE

Vue 实现过期接口拦截方案

在 Vue 项目中拦截过期接口通常需要结合 Axios 拦截器和后端返回的状态码进行处理。以下是几种常见实现方式:

基于 HTTP 状态码的拦截

后端通常会在接口过期时返回特定状态码(如 401 或 403)。可以在 Axios 响应拦截器中统一处理:

// axios 拦截器配置
axios.interceptors.response.use(
  response => response,
  error => {
    const { status } = error.response
    if (status === 401 || status === 403) {
      // 跳转登录页或刷新 token
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

基于自定义响应字段的拦截

部分 API 设计会在响应体中包含过期标识字段:

axios.interceptors.response.use(response => {
  if (response.data.code === 'TOKEN_EXPIRED') {
    // 执行 token 刷新逻辑
    return refreshToken().then(() => axios(response.config))
  }
  return response
})

Token 自动刷新机制

实现无感知的 token 刷新流程:

let isRefreshing = false
const failedQueue = []

axios.interceptors.response.use(null, error => {
  if (error.response.status === 401 && !isRefreshing) {
    isRefreshing = true
    return refreshToken().then(newToken => {
      // 重试所有失败的请求
      failedQueue.forEach(prom => prom.resolve(axios(prom.config)))
      failedQueue.length = 0
      return axios(error.config)
    }).finally(() => {
      isRefreshing = false
    })
  }

  // 将请求加入队列等待刷新后重试
  if (isRefreshing) {
    return new Promise((resolve) => {
      failedQueue.push({ resolve, config: error.config })
    })
  }

  return Promise.reject(error)
})

结合 Vuex 的状态管理

在大型项目中建议结合状态管理处理过期状态:

// store/modules/auth.js
actions: {
  checkApiExpiry({ commit }, error) {
    if (error.response.data.code === 'API_DEPRECATED') {
      commit('SET_API_EXPIRED', true)
    }
  }
}

// 组件中
this.$store.dispatch('checkApiExpiry', error)

版本控制拦截

对于接口版本过期的场景:

vue实现过期接口拦截

axios.interceptors.response.use(response => {
  if (response.headers['api-version'] !== currentVersion) {
    showVersionWarningModal()
  }
  return response
})

注意事项

  1. 避免循环刷新:需要设置最大刷新次数限制
  2. 并发请求处理:使用队列管理多个并发过期请求
  3. 用户提示:过期时应提供友好提示而非直接跳转
  4. 本地缓存清理:接口过期时需清除相关本地存储数据

以上方案可根据实际项目需求组合使用,建议配合后端定义的明确过期标识规范实现。

标签: 接口vue
分享给朋友:

相关文章

vue实现缩放

vue实现缩放

Vue 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现弹幕

vue实现弹幕

Vue 实现弹幕功能 弹幕功能通常包括动态生成、滚动显示、颜色和速度随机化等特性。以下是基于 Vue 3 的实现方法。 核心思路 使用 CSS 动画控制弹幕从右向左滚动。 动态生成弹幕数据,随机设置…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…