Vue中的请求拦截器和响应拦截器用法及说明

 更新时间:2023年05月24日 10:20:31   作者:小白在线学前端  
这篇文章主要介绍了Vue中的请求拦截器和响应拦截器用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue请求拦截器和响应拦截器用法

今天就讲一下什么是请求拦截器,和请求拦截器的作用,好了,多余的话我就不说了,马上开始今天的讲解

开始啦

请求拦截器

请求拦截器的作用是:

在请求发送前进行一些操作,例如在每个请求体里面加上token,统一做了处理的,如果要更改也是非常的容易。

关于拦截

这里只说原理,前端的请求,最终离不开Ajax,像Vue的Vue-ResourceAxios,都只是对Ajax进行了统一的封装,它暴露出来的拦截器,其实就是写了一个方法,把Ajax写在这个方法里面(我们先说请求拦截器),在执行的时候,先将请求时要添加给请求头的那些数据(Token、后端要的加密的密码)先执行一遍,都赋值给一个变量,然后再统一传给Ajax,接下来,就是执行Ajax,这就是所谓的请求拦截器,其实就是先执行要添加的数据,然后再执行Ajax,如果把这个添加数据的过程抽出来,就成了所谓的请求拦截器了

// 请求超时时间
axios.defaults.timeout = 120000
// 添加请求拦截器
axios.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // 判断是否存在token,如果存在将每个页面header都添加token
    if (window.sessionStorage.getItem('DT')) {
      // 请求头配置全局token
      config.headers.DT = window.sessionStorage.getItem('DT')
    }
    return config
  },
  err => {
    // 对请求错误做些什么
    Vue.prototype.$message.error('请求超时')
    return Promise.reject(err)
  }
)

响应拦截器

响应拦截器的作用就是

在接收到响应后再进行一些操作,例如在服务器返回登录状态失效的时候,需要重登录,跳转到登录页面,

响应拦截器,就是是在请求结果的返回后的同时,先不直接导出,而是先对响应码等等的进行处理,处理好之后再导出给页面,如果将这个对象响应码的处理过程抽出来,就成了所谓的响应拦截器

代码如下

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // res是响应的结果
    switch (response.data.code) {
      case 401:
        // 登录失效
        // 响应成功的拦截
        console.log('响应拦截器:')
        // console.log(response.data)
        Vue.prototype.$message.error(response.data.message)
        sessionStorage.removeItem('DT')
        router.push('/login')
        break
      case 404:
        if (response.data.message !== null) {
          Vue.prototype.$message.error(response.data.message)
        } else {
          Vue.prototype.$message.error('未知错误')
        }
        break
      case 500:
        // 错误
        if (response.data.message !== null) {
          Vue.prototype.$message.error(response.data.message)
        } else {
          Vue.prototype.$message.error('未知错误')
        }
        break
      default:
        return response
    }
    return response
  },
  err => {
    if (err.response.data.message) {
      Vue.prototype.$message.error(err.response.data.message)
      return Promise.reject(err.response.data.message) // 返回接口返回的错误信息
    } else {
      // 返回状态码不为200时候的错误处理
      Vue.prototype.$message.error(err.toString())
      return Promise.resolve(err)
    }
  }
)

页面中请求接口时:

// 用户登录提交
    login() {
      // debugger
      this.$refs.loginFormRef.validate(async valid => {
        if (!valid) return
        if (valid) {const userInfo = {
            username: this.loginForm.username,
            password: this.loginForm.password
          }
          // 登录之前去除token
          window.sessionStorage.removeItem('DT')
          const { data: res } = await this.$http.post('/system/login', userInfo)
          if (res.code !== 200) {
            this.initCaptcha()
            return
          }
          this.$message.success('登录成功')
          window.sessionStorage.setItem('DT', res.result.token)
          this.$router.push('/main')
        }
      })
    }

心得:

  • 请求拦截器:其实就是先执行要添加的数据,然后再执行Ajax,如果把这个添加数据的过程抽出来,就成了所谓的请求拦截器了
  • 响应拦截器:就是是在请求结果的返回后的同时,先不直接导出,而是先对响应码等等的进行处理,处理好之后再导出给页面,如果将这个对象响应码的处理过程抽出来,就成了所谓的响应拦截器

使用axios请求拦截器和响应拦截器

在使用一些前后端会话时,需要在请求头中携带一些特殊请求头,这样,就需要设置请求拦截器和响应拦截器

开发项目时,由于后端使用了token令牌,登录后在前端保存,然后每次请求都要携带token,将这些配置写在main.js文件中是很乱的不易于阅读,额外配置了axios请求配置模块 这样在以后对于请求响应都能更好的配置而不会影响其他配置

如果不使用请求拦截,那么对每一条请求每一个状态都要特殊处理,如果请求特殊状态有数十个,每个页面有很多请求,那么页面会变得很长很臃肿,不好维护。

如何使用?

1.在utils文件夹中创建 一个request.js文件

文件内容为(这里必须export这个配置后,才能被):

const service = axios.create({
    timeout: 6000  //请求超时为6秒
}); //创建一个axios, 命名为service

2.先写请求拦截器的逻辑代码

//请求拦截器
 service.interceptors.request.use(function(config) {
    // 处理请求之前的配置
    //在请求头headers加入token校验
     config.headers["token"] = "aded434088c7bcc595ec1c36c24aea1c"
     return config
 }, function(error) {
      // 请求失败的处理
     return Promise.reject(error);
 });

3.接着写响应拦截器的逻辑代码

service.interceptors.response.use(function (response) {
    // 在接收响应做些什么,例如跳转到登录页
    ......
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

4.在统一管理的接口文件api.js使用

5.移除拦截器的方法

axios.interceptors.request.eject(service); //service为第一步中创建的axios

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue中el-table和jsplumb实现连线功能

    vue中el-table和jsplumb实现连线功能

    本文主要介绍了el-table和jsplumb实现连线功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • vue环境变量配置之process.env解读

    vue环境变量配置之process.env解读

    这篇文章主要介绍了vue环境变量配置之process.env解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 最细致的vue.js基础语法 值得收藏!

    最细致的vue.js基础语法 值得收藏!

    这篇文章主要为大家推荐了一篇值得收藏和学习的vue.js最细致的基础语法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • vue 中的 render 函数作用详解

    vue 中的 render 函数作用详解

    这篇文章主要介绍了vue 中的 render 函数作用,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 关于移动端与大屏幕自适应适配方案

    关于移动端与大屏幕自适应适配方案

    这篇文章主要介绍了关于移动端与大屏幕自适应适配方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue 父组件通过v-model接收子组件的值的代码

    vue 父组件通过v-model接收子组件的值的代码

    这篇文章主要介绍了vue 父组件通过v-model接收子组件的值的代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Vue+Element实现表格编辑、删除、以及新增行的最优方法

    Vue+Element实现表格编辑、删除、以及新增行的最优方法

    这篇文章主要为大家详细介绍了Vue+Element实现表格的编辑、删除、以及新增行的最优方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • AntV+Vue实现导出图片功能

    AntV+Vue实现导出图片功能

    AntV 组织图操作完毕以后,需要点击按钮将画布以图片的形式导出,这篇文章主要介绍了AntV结合Vue实现导出图片功能,需要的朋友可以参考下
    2023-01-01
  • 基于vue实现简易打地鼠游戏

    基于vue实现简易打地鼠游戏

    这篇文章主要为大家详细介绍了基于vue实现简易打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 记一次用ts+vuecli4重构项目的实现

    记一次用ts+vuecli4重构项目的实现

    这篇文章主要介绍了记一次用ts+vuecli4重构项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论