1. 什么是跨域?
-
因为浏览器有同源策略,是判断一个浏览器是否合格的最基本的标准
-
什么是同源?
- 是浏览器通过这个策略,将不同的网站分类(隔离),就确保了信息的安全。你想一想要是没有这个东西,我们是不是可以随便请求淘宝接口,甚至给post一些信息到它们接口上,可能就乱套了
-
所以它是很必要的,我们再来明确一个概念,需要达到3个条件,相同协议,相同域名,相同端口,才能通讯。
项目 | Value | 是否允许通讯 |
---|---|---|
http://www.A.com 和https://www.A | 不同协议 | 不允许 |
http://www.A.com 和http://www.B.com | 不同域名 | 不允许 |
http://www.A.com:8080 和 http://www.A.com | 不同端口 | 不允许 |
http://www.A.com/4399/A 和http://www.A.com/4399/A/B | 三个条件满足 | 才允许 |
二,解决跨域问题 (第一种解决方法是从前端入手)
- 可以通过jsonp
-首先我们先明白jsonp的原理,通俗的讲就是动态生成一个script,然后script不受同源策略的限制,就可以去请求不同域的接口了(不能理解?想象一下你的jQuery是怎么引入的,是不是script后面一个网址?道理是一样的。)
// 使用Jq的ajax
$ajax({
// 请求的路径(请求接口) url
url:"http://www/A.com/B",
// 请求的方法 GET
type:"GET",
// 请求方式为jsonp
datatype:"jsonp",
// 这里可以使用自定义回调函数名
jsonpCallback:"bacData",
// 等待服务器返回的数据
data:{}
})
但是jsonp只能GET,而不能POST。
jquery已经封装好这个函数,只要通过这个模式去写就行了,自动生成script去执行。
- 跨域资源共享,CORS
- 这个说白了就是后台代码允许某个域名下的请求,比如我是后台开发的人员,我可以写上允许 http://www.beginner.com 所有的接口调用。
- (后端做的,不需要前端做任何的解决跨域的操作,直接ajax请求就行了),让后端大佬写上,你就不用考虑这个跨域了
//服务端代码写上,允许http://www.beginner.com下的所有请求
'Access-Control-Allow-Origin' : 'http://www.beginner.com'
- 后端代理
-
是如果这个后台不是你们团队写的,你又很想去调用这个接口,那怎么办呢?
-
很简单,同源策略是哪里来的,浏览器规定的,那你不要在浏览器内发起请求不就好了!!
-
你可以写一个简单的后端程序,让你的调用接口请求让它去做。然后这个后端程序是你控制的,所以你想怎么请求都行。easy
-
var http = require("http");
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
var server = http.createServer(function(req, res) {
delete req.headers.host;
proxy.web(req, res, {target: 'http://www.beginner.com'});
});
console.log("proxy listening on port 80")
server.listen(80);