常用的几种解决跨域的方法

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

 

posted @ 2015-07-17 10:55  刘牛牛  阅读(159)  评论(0编辑  收藏  举报