美文网首页Vue
vue解决开发环境、生产环境下的跨域问题

vue解决开发环境、生产环境下的跨域问题

作者: CoderZb | 来源:发表于2020-02-29 13:35 被阅读0次

    项目部署到服务器上了,请求遇到跨域的问题是非常常见的事情。我报错的内容如下:
    Access to XMLHttpRequest at 'https://www.feiyangwang.xin/storeActivation/getNotPaymentStoreListForUser' from origin 'http://localhost:8082' has been blocked by CORS policy: Request header field __retrycount is not allowed by Access-Control-Allow-Headers in preflight response.

    image.png
    原因是因为,我用的是自己个人的服务器上传的代码,域名也是我自己的,而发起请求的地址是公司的地址,所以跨域是必然。

    解决办法:

    步骤一:请求头配置

    前台注释掉请求拦截器里面的config.headers.Authorization = window.sessionStorage.getItem('token')这段代码

    Vue.prototype.$fyhttp = axios
    // axios请求拦截器
    axios.interceptors.request.use(config => {
      console.log("请求拦截器------", config)
    
      // 为请求头对象,添加Token验证的Authorization字段
      // config.headers.Authorization = window.sessionStorage.getItem('token')
      if (typeof config.data === "object") {
        config.data.token = '33333';
        config.data = qs.stringify(config.data); //数据 转换,使用qs插件,将json对象转成指定格式
      }
      return config
    }, error => {
      return Promise.reject(error);
    });
    

    或者让后台开发人员在header里面增加如下代码

    header('Access-Control-Allow-Headers:x-requested-with,content-type,Authorization ');
    
    步骤二:操作config目录下的dev.env.jsprod.env.js两个文件

    这里开发环境和生产环境我配置的请求地址都是一样的,当然,你也可以设置成不一样的。

    image.png
    • dev.env.js文件中,新增API_HOST:'"https://api.feiyang.life"',,那么开发环境下的请求地址就配置好了。后续你执行sudo cnpm run dev命令,运行界面的时候,请求的地址就是 prod.env.js下的https://api.feiyang.life
    'use strict'
    const merge = require('webpack-merge')
    const prodEnv = require('./prod.env')
    
    module.exports = merge(prodEnv, {
      NODE_ENV: '"development"',
      API_HOST:'"https://api.feiyang.life"',
    })
    
    
    • prod.env.js文件中,新增API_HOST:'"https://api.feiyang.life"',,那么生产环境下的请求地址就配置好了。后续你执行sudo cnpm run build命令,进行打包的时候,请求的地址就是 prod.env.js下的https://api.feiyang.life
    'use strict'
    module.exports = {
      NODE_ENV: '"production"',
      API_HOST:'"https://api.feiyang.life"',
    }
    
    步骤三(可忽略):在main.js对axios起别名,并拦截网络请求
    import axios from 'axios'
    Vue.prototype.$fyhttp = axios
    axios.interceptors.request.use(config => {
      console.log("请求拦截器------", config)
      if (typeof config.data === "object") {
        config.data.token = '33333';
        // 转换数据,这里依赖qs模块,将json转param
        // 因为这里对请求传递的参数进行了拦截并转换,所以下个步骤中的`data:jsonParams`不用再转换了
        config.data = qs.stringify(config.data); 
      }
      return config
    }, error => {
      return Promise.reject(error);
    });
    
    步骤四:拼接请求路径process.env.API_HOST + "/item/info",测试是否成功
    var jsonParams = { itemId: 970 };
    this.$fyhttp({
      method: "post",
      url: process.env.API_HOST + "/item/info",
      data: jsonParams,
      timeout: 1000
    })
      .then(res => {
        console.log(res);
        console.log(JSON.stringify(res));
        if (res.status == 200) {
          //  this.$router.push("/register");
          window.sessionStorage.setItem("token", "jdsjdlksadljdadghgff");
          this.$router.push("/mainPage");
        } else {
          console.log("异常情况");
        }
      })
      // 解决网络异常,不写如下catch,会在控制台打印报错信息的问题
      .catch(error => {
    
      });
    },
    
    步骤五:ok,获取到了数据
    image.png image.png

    相关文章

      网友评论

        本文标题:vue解决开发环境、生产环境下的跨域问题

        本文链接:https://www.haomeiwen.com/subject/puephhtx.html