当前位置:首页 > VUE

vue实现过期接口拦截

2026-01-22 00:52:58VUE

vue实现过期接口拦截的方法

在Vue项目中实现过期接口拦截通常需要结合axios拦截器和后端返回的状态码或自定义字段。以下是几种常见实现方式:

基于HTTP状态码的拦截

当后端返回特定状态码(如401)时触发拦截逻辑:

// axios响应拦截器
axios.interceptors.response.use(response => {
  return response
}, error => {
  if (error.response.status === 401) {
    // 清除本地token
    localStorage.removeItem('token')
    // 跳转登录页
    router.push('/login')
    // 可添加提示
    Message.error('登录已过期,请重新登录')
  }
  return Promise.reject(error)
})

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

当后端在响应体中返回特定字段时触发拦截:

axios.interceptors.response.use(response => {
  if (response.data.code === 1001) {
    // 处理token过期逻辑
    refreshToken().then(() => {
      return axios(response.config)
    })
  }
  return response
})

自动刷新token方案

实现token过期后自动刷新并重发请求:

let isRefreshing = false
let requests = []

axios.interceptors.response.use(response => {
  return response
}, error => {
  const { config, response } = error
  if (response.status === 401 && !config._retry) {
    if (!isRefreshing) {
      isRefreshing = true
      return refreshToken().then(res => {
        const { token } = res.data
        setToken(token)
        config.headers.Authorization = `Bearer ${token}`
        requests.forEach(cb => cb(token))
        requests = []
        return axios(config)
      }).finally(() => {
        isRefreshing = false
      })
    } else {
      return new Promise(resolve => {
        requests.push(token => {
          config.headers.Authorization = `Bearer ${token}`
          resolve(axios(config))
        })
      })
    }
  }
  return Promise.reject(error)
})

结合Vuex的全局状态管理

在store中管理登录状态和拦截逻辑:

// store/modules/user.js
actions: {
  checkToken({ commit }, error) {
    if (error.response.status === 401) {
      commit('CLEAR_USER_INFO')
      router.push('/login')
    }
  }
}

// axios拦截器中调用
error => {
  store.dispatch('user/checkToken', error)
  return Promise.reject(error)
}

前端主动检查token有效期

在请求发出前检查token是否即将过期:

vue实现过期接口拦截

axios.interceptors.request.use(config => {
  const token = getToken()
  if (token && isTokenExpired(token)) {
    // 主动刷新token或提示用户
    return refreshToken().then(() => {
      config.headers.Authorization = `Bearer ${getToken()}`
      return config
    })
  }
  return config
})

注意事项

  1. 避免重复刷新token,需要添加标志位控制
  2. 对于并发请求,需要队列管理等待中的请求
  3. 刷新token失败后应跳转登录页
  4. 生产环境应添加错误边界处理
  5. 可结合路由守卫实现全局拦截

以上方案可根据实际项目需求组合使用,建议与后端协商统一的token过期处理规范。

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

相关文章

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

轮播vue实现

轮播vue实现

使用 Vue 实现轮播功能 基础轮播实现 安装依赖(如使用 Swiper): npm install swiper vue-awesome-swiper 组件代码示例: <template&…

vue实现例子

vue实现例子

以下是一些常见的 Vue 实现例子,涵盖基础功能到进阶应用场景: 基础数据绑定 使用 v-model 实现双向数据绑定: <template> <div> &l…