vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue请求拦截器和响应拦截器

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

作者:小白在线学前端

这篇文章主要介绍了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')
        }
      })
    }

心得:

使用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

总结

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

您可能感兴趣的文章:
阅读全文