zoukankan      html  css  js  c++  java
  • vue

    每个请求都需要携带 token ,所以我们可以使用 axios request 拦截器,

    1.安装axios :npm i axios

    2.在main.js 里注册

    import axios from 'axios';
    Vue.prototype.$axios = axios;

    3.实现

    let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
    let cancelToken = axios.CancelToken;
    let removePending = (config) => {
      for(let p in pending){
        if(pending[p].u === config.url + '&' + config.method) { //当前请求在数组中存在时执行函数体
          pending[p].f(); //执行取消操作
          pending.splice(p, 1); //把这条记录从数组中移除
        }
      }
    }
    
    // ajax请求统一增加请求头
    axios.interceptors.request.use(config => {
        config.headers.common = {
          'Content-Type': "application/x-www-form-urlencoded",
          'Access-Control-Allow-Origin':'*',
          'Access-Control-Allow-Headers':'X-Requested-With,Content-Type',
          'Access-Control-Allow-Methods':'PUT,POST,GET,DELETE,OPTIONS',
          'x-authentication-token': localStorage.XMDADMINTOKEN==undefined?'':localStorage.XMDADMINTOKEN
        }
        //config.timeout = 3600*24*7;
        config.timeout = 10000;
         // let token=localStorage.XMDADMINTOKEN;
         // console.log(token);
    
        let str_data = JSON.stringify(config.data || '{}');
        // 参数中携带cancelHttp,不防止多次请求
        if (str_data.indexOf("cancelHttp") > -1) {
          httpFlag = false
        }else {
          removePending(config); //在一个ajax发送前执行一下取消操作
          config.cancelToken = new cancelToken((c)=>{
            // 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式
            pending.push({ u: config.url + '&' + config.method, f: c });
          });
        }
        return config
      },
      err => {
        return null
      })
    
    // 是否防止多次请求
    let httpFlag = true
    // 拦截响应response,并做一些错误处理
    axios.interceptors.response.use((response) => {
      // const data = response.data;
      // console.log(data);
      if (httpFlag) {
        removePending(response.config);  //在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除
      }
    
      //return data;
      return response;
    }, (err) => {
      // 这里是返回状态码不为200时候的错误处理
      if (err.toString().indexOf("timeout") != -1) {
        Toast({
          message: '请求超时,请稍后再试'
        });
      }
      if (err && err.response) {
        switch (err.response.status) {
          case 400:
            err.message = '请求错误'
            break
    
          case 401:
            localStorage.XMDADMINTOKEN="";
            err.message = '未授权,请登录';
            router.push({path: '/Login'});
    
            break
    
          case 403:
            err.message = '拒绝访问'
            break
    
          case 404:
            err.message = `请求地址出错: ${err.response.config.url}`
            break
          case 405:
            err.message = `请求地址出错:`
            break
          case 408:
            err.message = '请求超时'
            break
    
          case 500:
            err.message = '网络错误,请稍后再试'
            break
    
          case 501:
            err.message = '网络错误,请稍后再试'
            break
    
          case 502:
            err.message = '网络错误,请稍后再试'
            break
    
          case 503:
            err.message = '网络错误,请稍后再试'
            break
    
          case 504:
            err.message = '网络错误,请稍后再试'
            break
    
          case 505:
            err.message = 'HTTP版本不受支持'
            break
    
          default:
        }
        if (err.response.data.msg) {
          err.message = err.response.data.msg;
        }
        Toast({
          message: err.message
        });
      }
      return Promise.reject(err)
    })
    
    








  • 相关阅读:
    ansible设置串行的方法
    给k8s集群中的node节点加标签
    Prometheus断电后启动异常 Error on ingesting samples
    配置 containerd 镜像仓库完全攻略
    这款网络排查工具,堪称神器!
    k8s备份工具之velero
    CentOS 7安装megacli
    Atitit .h5文件上传 v3
    php切片处理视频大文件思路
    php切片处理视频大文件功能
  • 原文地址:https://www.cnblogs.com/sun927/p/10683945.html
Copyright © 2011-2022 走看看