vue配置请求拦截和响应拦截

本文介绍了如何在Vue项目中使用axios进行请求和响应的拦截处理,包括设置超时时间、处理token、添加headers以及错误处理和成功响应的拦截。通过封装统一的http请求,方便管理和维护后台管理系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:
我们在做后台管理系统时通常会封装统一的http请求,这样方便我们来管理axios请求配置

  1. 我们通常会在请求是定义一个超时时间
  2. 在请求拦截器中做token的:超时、更新、headers请求头的处理
  3. 在响应拦截器中做 请求失败状态时的错误处理和成功直接返回结果。
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTimeStamp, getRefreshToken, getExpiresIn } from '@/utils/auth'
const TimeOut = getExpiresIn() // token失效时间
const refreshTokenTime = TimeOut - 900 // 开始换token的时间
var refreshToken = 0 // 换token只请求一次标识

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 设置axios请求的基础的基础地址
  timeout: 15000 // 定义5秒超时
}) // 创建一个axios的实例

// 请求拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    const checkTime = IsCheckTimeOut()
    // console.log(checkTime, '当前使用时间')
    // console.log(checkTime > TimeOut)
    // console.log(refreshTokenTime < checkTime && TimeOut > checkTime)
    if (checkTime) {
      if ((checkTime > TimeOut) && !config.url.includes('/logout')) {
        console.log('登出')
        store.dispatch('user/logout') // 登出操作
        return Promise.reject(new Error('token超时了'))
      } else if ((refreshTokenTime < checkTime && TimeOut > checkTime) && !config.url.includes('/refresh/Token') && refreshToken !== 1) {
        console.log('刷新')
        var params = {
          systemCode: process.env.VUE_APP_CLIENT_ID,
          refreshToken: getRefreshToken()
        }
        refreshToken = 1
        store.dispatch('user/refreshToken', params).then(() => {
          refreshToken = 0
          console.log(store.getters.token, '更新了token')
        })
      }
    }
    config.headers['Authorization'] = `${store.getters.token}`
  }
  return config // 必须返回配置
}, error => {
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(response => {
  // axios默认加了一层data
  const data = response.data
  //   要根据success的成功与否决定下面的操作
  if (data.success) {
    return data
  } else {
    Message.error(data.message) // 提示错误消息
    return Promise.reject(new Error(data.message))
  }
}, error => {
  if (error.response && error.response.data && error.response.data.code === 8888) {
    store.dispatch('user/logout') // 登出操作
    router.push('/login')
  } else {
    Message.error(error.message) // 提示错误信息
  }
  return Promise.reject(error) // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
})

// 是否超时
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差
function IsCheckTimeOut() {
  var currentTime = Date.now()
  if (getTimeStamp()) {
    var timeStamp = getTimeStamp()
    return (currentTime - timeStamp) / 1000
  } else {
    return null
  }
}

export default service


工作之余 用博客记录自己 希望有能帮助到各位看官
如有错误或不全面的地方望各位能提点一二和留下宝贵意见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值