vue开发环境和生产环境的跨域

摘要:
api是我们前端代理的那个api。proxy_pass后面就是跨域地址我在网上找到很多配置很全的nginx.config,有疑问还可以搜搜。

前端在生产环境跨域

一,开发环境跨域

1.配置代理

如果使用vue-cli搭建的项目,可以直接使用proxyTable模块,项目框架已经集成
在config -> index.js 页面配置proxyTable,如下:

proxyTable: {
      '/api':{
            //开发坏境下:target 里的地址是你跨域请求的地址
            target:'http://baidu.com',
            changeOrigin:true,
            pathRewrite:{
              '^/api':''  //代表上面的地址,在别的页面用api代替
}
        },
        //若是存在多个跨域问题,可代理多个
       '/bili':{
            target:'http://bilibili.com',
            changeOrigin:true,
            pathRewrite:{
              '^/bili':''}
        }
    }

显然,大部分情况我们不可能为每个api接口都在这加一个规则,所以更好的配置是:

proxyTable: {
    '**': {
        target: 'http://127.0.0.1:3000',
        changeOrigin: true,   //允许跨域
}
}
或者
proxyTable: [{
    context: ['/**'],
    target: 'http://127.0.0.1:3000',
    changeOrigin: true,  //允许跨域
}]

2. 使用this.axios的配置
使用axios需要安装并配置全局(安装不说了)

axios配main.js:

vue开发环境和生产环境的跨域第1张

3.在需要的页面使用

//api 就是在config-index中代理的api,后面是具体的接口和参数
 this.$axios.post(‘api/update’, { param: paramdata }).then(res => {...})

4.在浏览器 network 中查看

vue开发环境和生产环境的跨域第2张

前面是本地项目的地址,后面跟的api就是代理地址,实现跨域

二,后端处理 CORSFilter

1.完全交予后端解决,配值请求头信息(core)

 response.setHeader("Access-Control-Allow-Origin", "*");//* or origin as u prefer
 response.setHeader("Access-Control-Allow-Credentials", "true");
 response.setHeader("Access-Control-Allow-Methods", "PUT, POST, GET, OPTIONS, DELETE");
 response.setHeader("Access-Control-Max-Age", "3600");
 response.setHeader("Access-Control-Allow-Headers", "content-type, authorization");

若是后端可以处理的话,前端就可以放手“高枕无忧”了,开发环境生产环境都OK,具体使用后端小伙伴应该都懂,OK啦

三,生产环境跨域

配置nginx代理

使用nginx反向代理,在配置文件nginx.conf中找到server{}对象,更改项目地址root和配置代理地址proxy_pass,这个方法适合前端静态文件使用:

location /{
    root   D:/browseClient/dist;  #自己的前端项目地址
    index  index.html index.htm;
}
#解决跨域
location /api {                                # 自定义nginx接口前缀
    proxy_pass   http://127.0.0.1:3000;            # 后台api接口地址
            proxy_redirect default;      
    #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
}

vue开发环境和生产环境的跨域第3张

location是线上地址。
api是 我们前端代理的 那个api。
proxy_pass 后面就是跨域地址
我在网上找到很多配置很全的nginx.config,有疑问还可以搜搜。

四,前端用原生ajax处理跨域

不用后端了!!!
代码如下,公用部分:

export functionhttpRequest(paramObj, fun, errFun) {
  var xmlhttp = null
  /*创建XMLHttpRequest对象,
     *老版本的 Internet Explorer(IE5 和 IE6)使用 ActiveX 对象:new ActiveXObject("Microsoft.XMLHTTP")
     * */
  if(window.XMLHttpRequest) {
    xmlhttp = newXMLHttpRequest()
  } else if(window.ActiveXObject) {
    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP')
  }
  /*判断是否支持请求*/
  if (xmlhttp == null) {
    alert('你的浏览器不支持XMLHttp')
    return}
  /*请求方式,并且转换为大写*/
  var httpType = (paramObj.type || 'GET').toUpperCase()
  /*数据类型*/
  //var dataType = paramObj.dataType || 'json'
  /*请求接口*/
  var httpUrl = paramObj.httpUrl || ''
  /*是否异步请求*/
  var async = paramObj.async || true
  /*请求参数--post请求参数格式为:foo=bar&lorem=ipsum*/
  var paramData = paramObj.data ||[]
  var requestData = ''
  for (var name inparamData) {
    requestData += name + '=' + paramData[name] + '&'}
  requestData = requestData === '' ? '' : requestData.substring(0, requestData.length - 1)
  console.log(requestData)

  /*请求接收*/xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
      /*成功回调函数*/fun(xmlhttp.responseText)
    } else{
    /*失败回调函数*/errFun
    }
  }

  /*接口连接,先判断连接类型是post还是get*/
  if (httpType === 'GET') {
    xmlhttp.open('GET', httpUrl, async)
    xmlhttp.send(null)
  } else if (httpType === 'POST') {
    xmlhttp.open('POST', httpUrl, async)
    //发送合适的请求头信息
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
    xmlhttp.send(requestData)
  }
}

在需要处理的页面引入这个公共方法:

import { httpRequest } from '@/utils/index'

使用:

vue开发环境和生产环境的跨域第4张

转载于:https://blog.csdn.net/qq_41612675/article/details/98745112

参考:https://blog.csdn.net/LEGLO_/article/details/96712706

https://www.cnblogs.com/pass245939319/p/9040802.html

免责声明:文章转载自《vue开发环境和生产环境的跨域》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)Qt 直接构建XML开发web services客户端程序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue发布IIS踩坑记

步骤一:复制文件 把build之后的文件(dist文件夹)拷贝到IIS存放网站文件的目录 步骤二:在IIS中新建站点  在"网站"执行鼠标右键,选择添加网站。 网站名称:按照用途或者项目起名即可 应用程序池:部署前端项目,这个可以忽略,任意选择即可 内容目录:网站存放的路径,最好以英文命名 端口:端口自己设置即可 步骤三:访问网站  访问网站可以在II...

Vue的插值语法

1、mustache语法 <div id="app">{{message}} vue <br>{{firstName + ' ' +lastName}} <br>{{firstName}} {{lastName}} <br>{{counter * 2}} </div> 2、v-once...

vue 优化小技巧 之 require.context()

1、require.context() 回忆一下 当我们引入组件时   第一步 创建一个子组件   第二步 import ... form ...     第三步 components:{..}       第四步 页面使用 <...></...>   代码实现:                                 ...

几个免费IP地址查询API接口

转:http://blog.csdn.net/ishxiao/article/details/52670242 ---------------------------------------------------------------------------------------------------------------------------...

Vue之render函数

render函数是vue中的一个重要函数 文档地址:https://cn.vuejs.org/v2/api/#render 类型 (createElement: () => VNode) => VNode 详细 字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个...

vue中使用v-chart改变柱状图颜色以及X轴Y轴的文字颜色和大小以及标题

1.html部分 <ve-histogram :tooltip-visible="true" :x-axis="xAxis" :y-axis="yAxis" :title="title"...