当前位置:首页 > VUE

vue实现过期接口拦截

2026-01-22 00:52:58VUE

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

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

基于HTTP状态码的拦截

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

vue实现过期接口拦截

// 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过期后自动刷新并重发请求:

vue实现过期接口拦截

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是否即将过期:

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中实现多级组件通常涉及父子组件嵌套,通过props向下传递数据,通过$emit向上传递事件。多级组件的核心是递归或动态组件渲染。 <!-- 父组件 Parent…

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue 简单实现

vue 简单实现

以下是 Vue 的简单实现示例,涵盖基础模板、数据绑定、方法及生命周期: 基础模板与数据绑定 <div id="app"> <p>{{ message }}</…