常用的几种解决跨域的方法
1. 利用jsonp来解决跨域
jsonp的实现核心就是利用script标签的跨域能力,于是乎我们可以这么做,动态生成一个script,然后把json的url赋值给script的src属性,然后再把这个script标签放在dom里...
<body> <script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script> <script type="text/javascript"> var s = document.createElement('script'); s.src = 'http://localhost:8080/a.json'; document.body.appendChild(s); </script> </body>
不过这样会报错,因为json数据不是合法的js语句,需要把json数据放在回调函数中,代码如下:
<body> <script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script> <script type="text/javascript"> function jsonpcallback(json) { console.log(json); } var s = document.createElement('script'); s.src = 'http://localhost:8080/a.json'; document.body.appendChild(s); </script> </body> jsonpcallback({ "name": "hanzichi", "age": 10 });
a.json并不一定要这样命名,如果是与服务器端交互的话,它的命名就可能是这样:
s.src="http://localhost:8080/test.php?callback=jsonpcallback";
需要注意的是,jsonp提供的url(即动态生成的script标签的src),无论看上去是什么形式,最终生成返回的都是一段js代码。
2. document.domain + iframe
应用场景:主域相同,但子域不同
具体做法:
在 www.a.com 上的 page1.html
//设置 domain 属性 document.domain = 'a.com'; //创建一个 iframe,去控制 iframe 的 contentWindow,这样两个js文件就可以相互“交互”了 var ifr = document.createElement('iframe'); ifr.src = 'http://script.a.com/page2.html'; ifr.style.display = 'none'; document.body.appendChild(ifr); ifr.onload = function(){ var doc = ifr.contentDocument || ifr.documentWindow.document; //可以操作 page2.html 中的元素了 }
在 script.a.com 上的 page2.html
//设置 domain 属性 document.domain = 'a.com'
关于主域名:
1、一个页面的 domain 默认是 window.location.hostname
2、主域名是不带 www 的域名,例如 a.com
3、主域名前带前缀的通常都是二级域名或多级域名,比如 www.a.com 其实是个二级域名
4、domain 只能设置成主域名,不可以将 domain 设置成 x.a.com
所以,这种方式适合于 {www.aaa.com, aaa.com, css.aaa.com, script.aaa.com} 中的任何页面间相互通信。
问题:
1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞
2、若一个页面中引入了多个 iframe,要想能操作所有 iframe,则必须都得设置成相同的 domain