JavaScript出于安全方面的考虑,不许可跨域调用其他页面的工具。那什么是跨域呢,大略地理解便是由于JavaScript同源策略的限定, a.com 域名下的js无法操作 b.com 或是 c.a.com 域名下的工具。
当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互要求资源,就算作“跨域”。例如:http://www.abc.com/index.html 要求 http://www.efg.com/service.php。
有一点必须要把稳:跨域并不是要求发不出去,要求能发出去,做事端能收到要求并正常返回结果,只是结果被浏览器拦截了。之以是会跨域,是由于受到了同源策略的限定,同源策略哀求源相同才能正常进行通信,即协议、域名、端口号都完备同等。

大家可以参照下图,有助于深入理解跨域。
特殊解释两点:
第一:如果是协议和端口造成的跨域问题“前台”是无能为力的。
第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会根据域名对应的IP地址是否相同来判断。“URL的首部”可以理解为“协议, 域名和端口必须匹配”。
二、什么是同源策略及其限定
同源策略限定从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。它的存在可以保护用户隐私信息,防止身份假造等(读取Cookie)。
同源策略限定内容有:
Cookie、LocalStorage、IndexedDB 等存储性内容DOM 节点AJAX 要求不能发送但是有三个标签是许可跨域加载资源:
<img src=XXX><link href=XXX><script src=XXX>接下来我们谈论下有哪些处理跨域的方法。但所有的跨域都必须经由信息供应方的许可。如果未经许可即可获取,那是浏览器同源策略涌现漏洞。
三、处理跨域方法一——JSONP
1.JSONP事理
利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 数据。JSONP要求一定须要对方的做事器做支持才可以。
2.JSONP和AJAX比拟
JSONP和AJAX相同,都是客户端向做事器端发送要求,从做事器端获取数据的办法。但AJAX属于同源策略,JSONP属于非同源策略(跨域要求)。
3.JSONP优缺陷
JSONP优点是兼容性好,可用于办理主流浏览器的跨域数据访问的问题。缺陷是仅支持get方法具有局限性。
4.JSONP的流程(以第三方API地址为例,不必考虑后台程序)
声明一个回调函数,其函数名(如fn)当做参数值,要通报给跨域要求数据的做事器,函数形参为要获取目标数据(做事器返回的data)。创建一个 <script>标签,把那个跨域的API数据接口地址,赋值给script的src,还要在这个地址中向做事器通报该函数名(可以通过问号传参 :?callback=fn)。做事器吸收到要求后,须要进行分外的处理:把通报进来的函数名和它须要给你的数据拼接成一个字符串,例如:通报进去的函数名是fn,它准备好的数据是 fn([{\"大众name\"大众:\公众jianshu\"大众}])。末了做事器把准备的数据通过HTTP协议返回给客户端,客户端再调用实行之前声明的回调函数(fn),对返回的数据进行操作。<script type=\"大众text/javascript\"大众 >function fn(data) {alert(data.msg);} </script> <script type=\"大众text/javascript\"大众 src=\"大众http://crossdomain.com/jsonServerResponse?jsonp=fn\"大众 ></script>
个中 fn 是客户端注册的回调的函数,目的获取跨域做事器上的json数据后,对数据进行在处理。
末了做事器返回给客户端数据的格式为:
fn({ msg:'this is json data'})
5.jQuery的jsonp形式
JSONP都是GET和异步要求的,不存在其他的要求办法和同步要求,且jQuery默认就会给JSONP的要求打消缓存。
$.ajax({url: \"大众http://crossdomain.com/jsonServerResponse\公众,dataType: \"大众jsonp\"大众,type: \"大众get\公众,//可以省略jsonpCallback: \"大众fn\公众,//->自定义通报给做事器的函数名,而不是利用jQuery自动天生的,可省略jsonp: \公众jsonp\公众,//->把通报函数名的那个形参callback变为jsonp,可省略success: function(data) {console.log(data);}});
四、处理跨域方法二——CORS
1.CORS事理
全体CORS通信过程,都是浏览器自动完成,不须要用户参与。对付开拓者来说,CORS通信与同源的AJAX通信没有差别,代码完备一样。浏览器一旦创造AJAX要求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的要求,但用户不会有觉得。因此,实现CORS通信的关键是做事器。只要做事器实现了CORS接口,就可以跨源通信。
2.CORS优缺陷
CORS哀求浏览器(>IE10)和做事器的同时支持,是跨域的根本办理方法,由浏览器自动完成。
优点在于功能更加强大支持各种HTTP Method,缺陷是兼容性不如JSONP。
只须要在做事器端做一些小小的改造即可:
header(\公众Access-Control-Allow-Origin:\"大众);header(\"大众Access-Control-Allow-Methods:POST,GET\"大众);
例如:网站 http://localhost:63342/ 页面要要求 http://localhost:3000/users/userlist 页面,userlist页面返回json字符串格 {name:'Mr.Cao',gender:'male',career:'IT Education'}:
//在做事器端设置同源策略地址router.get(\"大众/userlist\公众,function(req, res,next) {varuser = {name: 'Mr.Cao',gender: 'male',career: 'IT Education'};res.writeHeader(200, {\"大众Access-Control-Allow-Origin\"大众: 'http://localhost:63342'});res.write(JSON.stringify(user));res.end();});
在相应头上添加 Access-Control-Allow-Origin 属性,指定同源策略的地址。同源策略默认地址是网页的本身。只要浏览器检测到相应头带上了CORS,并且许可的源包括了本网站,那么就不会拦截要求相应。
五、处理跨域方法三——WebSocket
Websocket是HTML5的一个持久化的协议,它实现了浏览器与做事器的全双工通信,同时也是跨域的一种办理方案。WebSocket和HTTP都是运用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或吸收数据。同时,WebSocket 在建立连接时须要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。
原生WebSocket API利用起来不太方便,我们利用Socket.io,它很好地封装了webSocket接口,供应了更大略、灵巧的接口,也对不支持webSocket的浏览器供应了向下兼容。
六、处理跨域方法四——postMessage
如果两个网页不同源,就无法拿到对方的DOM。范例的例子是iframe窗口和 window.open方法打开的窗口,它们与父窗口无法通信。HTML5为理解决这个问题,引入了一个全新的API:跨文档通信 API(Cross-document messaging)。这个API为window工具新增了一个 window.postMessage 方法,许可跨窗口通信,不论这两个窗口是否同源。
postMessage方法的第一个参数是详细的信息内容,第二个参数是吸收的窗口的源(origin),即\"大众协议 + 域名 + 端口\"大众。也可以设为 ,表示不限定域名,向所有窗口发送。
接下来我们看个例子: http://localhost:63342/index.html页面向 http://localhost:3000/message.html通报“跨域要求信息”