跨域

什么是跨域?

  在不同的域名下进行数据交互就会产生跨域.JS为了安全起见,是不允许不同页面进行数据交互的.

  既然数据无法交互,就会对ajax产生影响,因为ajax是通过xmlHttpRequest进行数据交互,而这个对象在不安全的情况下不允许进行数据交互,所以说ajax不允许跨域.比如一个公司有多个网站,这几个网站进行合作的时候就会产生跨域问题.

什么情况下不存在跨域问题?

www.a.com/b.js

www.a.com/d.js

以下情况会存在跨域问题.

1.不同子域

2.不同域名下.哪怕这两个不同的域名指向同一个IP地址,也会存在跨域问题.

解决方式.

1.子域和主域之间都设置 dcument.domain = "主域名网址";

2.不同域名下通过服务器代理,通过XMLHttpRequeat代理文件.优点:可以做到任何想要的数据交互.缺点:增大服务器压力

3.script标签:jsonp格式,script不存在跨域.所以可以把src当做请求的地址.因为script标签除了可以请求JS文件,其他类型也是可以的.比如:php.只要页面运算完返回的是json或者JS,就不会有问题.

jsonp原理: json+padding:将json填充到一个盒子中.

 

注意:引入的文件必须放在底部.

动态创建script标签

 

 

 

4.location.hash

跨域无非就是发送一个请求去取页面中的数据,可以通过iframe.比如在a网站中嵌套一个b网站的iframe,可以把数据添加到它的hash值上,因为加上hash是不会改变页面的网址的,这样的话就可以把数据带过去,通过数据带过去之后,b网站进行解析然后返回数据,返回的时候它本身可以通过parent.location.hash = 来更新现在这个页面的hash值,通过更新这个页面的hash值就可以使这个页面来获取b网站上对应的数据了.parent.location.hash这个方法是另一个域下的,有的浏览器不支持,比如ie chrome.解决方法:可以再去创建一个a网站的页面,比如:yyy.html#,因为他们是同一个网站下的,这个时候parent.location.hash=self.location.hash.通过改变hash值来进行双域之间的数据交互.

5.window.name

 

总结:

  jsonp有一个缺点,它只是一个单域操作,就像以上说的,b网站的数据(我们要获取的)是不能修改的,而iframe的hash值是可以双域操作的.window.name比较安全,因为它不会暴露出来,各有好处,工作时需要择优选择.

 

posted on 2015-06-19 22:31  谷子多多  阅读(278)  评论(0编辑  收藏  举报