Max—— 前端攻城狮 's Blog

A Simple pure blog generated by jekyll

Javascript跨域总结

<< Back

什么是跨域

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。这里把涉及到跨域的一些问题简单地整理一下:

首先什么是跨域,简单地理解就是因为JavaScript同源策略(安全策略,要求同协议,同域名,同端口)的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。更详细的说明可以看下表:

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

注:其中主域相同,子域不同的情况下(http://www.a.com/a.js)和( http://script.a.com/b.js)的情况下,可以设置document.domain = www.a.com;这样就可以绕过同源策略互相访问了。

真假跨域的不同处理

真跨域

真跨域或者说严格跨域是指:不同协议(跨协议)或者不同端口(跨端口)这种情况下,前端是处理不了的。

假跨域

假跨域或者说松散跨域是指:仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上;前端可以通过一些方式跨域通信传输数据和信息。

URL的首部是指:window.location.protocol + window.location.host;
也可以理解为“Domains, protocols and ports must match”。

解决方案

1、document.domain+iframe的设置
2、动态创建script
3、利用iframe和location.hash
4、window.name实现的跨域数据传输
5、使用HTML5 postMessage

参考Javascript跨域总结和解决办法

发表于: 13 Oct 2014