vue-resource 怎么解决跨域问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-resource 怎么解决跨域问题相关的知识,希望对你有一定的参考价值。

参考技术A 跨域问题来源于javascript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。在以前,前端和后端混杂在一起, 比如JavaScript直接调用同系统里面的一个Httphandler,就不存在跨域的问题,但是随着现代的这种多种客户端的流行,比如一个应用通常会有Web端,App端,以及WebApp端,各种客户端通常会使用同一套的后台处理逻辑,即API, 前后端分离的开发策略流行起来,前端只关注展现,通常使用JavaScript,后端处理逻辑和数据通常使用WebService来提供json数据。一般的前端页面和后端的WebService API通常部署在不同的服务器或者域名上。这样,通过ajax请求WebService的时候,就会出现同源策略的问题。需要说明的是,同源策略是JavaScript里面的限制,其他的编程语言,比如在C#,Java或者ios等其他语言中是可以调用外部的WebService,也就是说,如果开发Native应用,是不存在这个问题的,但是如果开发Web或者html5如WebApp,通常使用JavaScript ajax对WebService发起请求然后解析返回的值,这样就可能存在跨域的问题。一般的,很容易想到,将外部的资源搬到同一个域上就能解决同源策略的限制的。即在Web网站上同时开发一个Http服务端页面,所有JavaScript的请求都发到这个页面上来,这个页面在内部使用其他语言去调用外部的WebService。即添加一个代理层。这种方式可以解决问题,但是不够直接和高效。目前,比较常见的跨域解决方案包括JSONP (JSON with padding)和CORS (Cross-origin resource sharing )。一些解决方案需要客户端和服务端配合如JSOP,一些则只需要服务端配合处理比如CORS。下面分别介绍这两种跨域方案,以及服务端WebService如何支持这两种跨域方案。JSONP以及WebService的支持同源策略下,某个服务器是无法获取到服务器以外的数据,但是html里面的img,iframe和script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。而JSONP就是通过script节点src调用跨域的请求。

使用proxyTable 解决webpack+vue-cli+vue-resource中跨域问题

技术分享

当游览器报这样的错时,表示你的请求需要跨域!

这里,我说的是使用webpack+vue-cli+vue-resource中跨域问题,

 

config文件下面有index.js文件里有一个叫proxyTable的配置参数

proxyTable: {
      ‘/restful‘:{
        target:‘http://xxxxx/member/service/‘,
        changeOrigin:true,
        pathRewrite:{//可以不写
            ‘^/restful‘:‘/restful‘
        }
      }
    },

changeOrigin这参数设置为true的时候,就可以虚拟一个本地代理的服务接收请求这样就可以解决跨域问题了target是你请求接口的域名

接口调用的时候可以这么写

this.$http.post(commonUrl + "/restful/member?op=getMember&access_token=111", {
          op: ‘getMember‘,
        }).then(response => 
        }, response => {

        });
      },

有关于API proxy的说明,使用的就是这个参数。
https://vuejs-templates.github.io/webpack/proxy.html

这个参数主要是一个地址映射表,你可以通过设置将复杂的url简化,例如我们要请求的地址是api.xxxxxxxx.com/list/1,可以按照如下设置:

 

proxyTable: {
  ‘/list‘: {
    target: ‘http://api.xxxxxxxx.com‘,
    pathRewrite: { //可以不写
      ‘^/list‘: ‘/list‘
    }
  }
}

 

这样我们在写url的时候,只用写成 /list/1 就可以代表api.xxxxxxxx.com/list/1.
那么又是如何解决跨域问题的呢?其实在上面的‘list‘的参数里有一个changeOrigin参数,接收一个布尔值,如果设置为true,那么本地会虚拟一个服务端接收你的请求并代你发送该请求,这样就不会有跨域问题了,当然这只适用于开发环境。增加的代码如下所示:

 

proxyTable: {
  ‘/list‘: {
    target: ‘http://api.xxxxxxxx.com‘,
    changeOrigin: true,
    pathRewrite: {
      ‘^/list‘: ‘/list‘
    }
  }
}

 



以上是关于vue-resource 怎么解决跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

vue-resource 怎么解决跨域问题

使用 vue-resource 发送跨域请求

使用proxyTable 解决webpack+vue-cli+vue-resource中跨域问题

如何使用vue-resource和proxy.php来解决跨域问题

axios可以解决跨域访问的问题吗

vue-resource可以跨域直接发送POST请求吗?