javascript跨域解决方案(一)
1、神马是跨域(Cross Domain)
说白点就是post、get的url不是你当前的网站,域名不同。例如在aaa.com/a.html里面,表单的提交action是bbb.com/b.html。
不仅如此,www.aaa.com和aaa.com之间也属于跨域,因为www.aaa.com是二级域名,aaa.com是根域名。
JavaScript出于安全方面的考虑,是不允许跨域调用其他页面的对象的(同源策略 Same-Origin Policy)。
关于JavaScript能否跨域通信的详细说明,见下表:
http://www.a.com/a.js访问以下URL的结果
URL说明是否允许通信http://www.a.com/b.js同一域名下允许http://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/b.js同一域名,不同端口不允许https://www.a.com/b.js同一域名,不同协议不允许http://70.32.92.74/b.js域名和域名对应ip不允许http://script.a.com/b.js主域相同,子域不同不允许http://a.com/b.js同一域名,不同二级域名(同上)不允许http://www.b.com/b.js不同域名不允许?
2、为嘛要跨域跨域这东西其实很常见,例如我们可以把网站的一些脚本、图片或其他资源放到另外一个站点。例如我们可以使用Google提供的jQuery,加载时间少了,而且减少了服务器的流量,如下:
那咋么办捏?(弱弱的说,测试的时候我发现IE访问本地文件时,是可以跨域的,不过这也没啥用~囧~)
3、肿么跨域下面为了更好的讲解和测试,我们可以通过修改hosts文件来模拟跨域的效果,hosts文件在C:\Windows\System32\drivers\etc 文件夹下。在下面加3行:
127.0.0.1 www.a.com
127.0.0.1 a.com
127.0.0.1 www.b.com
3.1、跨域代理一种简单的办法,就是把跨域的工作交给服务器,从后台获取其他站点的数据再返回给前台,也就是跨域代理(Cross Domain Proxy)。
这种方法似乎蛮简单的,改动也不太大。不过就是http请求多了些,响应慢了些,服务器的负载重了些~
?
3.2、document.domain+iframe对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。
举www.a.com/a.html和a.com/b.html为例,只需在a.html中添加一个b.html的iframe,并且设置两个页面的document.domain都为'a.com'(只能为主域名),两个页面之间即可互相访问了,代码如下:
www.a.com/a.html中的script
?
不过动态脚本注入还是存在不少问题的,下面我们拿它和XMLHttpRequest来对比一下:
?XmlHttpRequestDynamic Script Tag跨浏览器兼容NoYes跨域限制YesNo接收HTTP状态YesNo (除了200)支持Get、PostYesNo (GET
only)发送、接收HTTP头YesNo接收XMLYesYes接收JSONYesYes支持同步、异步YesNo (只能异步)?
可以看出,动态脚本注入还是有不少限制,只能使用Get,不能像XHR一样判断Http状态等。
而且使用动态脚本注入的时候必须注意安全问题。因为JavaScript没有任何权限与访问控制的概念,通过动态脚本注入的代码可以完全控制整个页面,所以引入外部来源的代码必须多加小心。