同源策略限制
Mashups中经常要获取和集成来自于不同提供者的内容,这些内容存在于非常不同的服务器或者域名上,因而有着不同的信任级别。比如:要显示的地图来自 于Google,天气情况来自于问天网,道路交通来自于交通网。他们不仅仅是域名不同,同时集成的内容本身之间还可能存在冲突,Google可能用 jQuery2.3版本,问天可能用jQuery的1.0版本。
同源策略就是浏览器的一种保护机制,该机制将来自不同域(假设域代表的是始发者)的 Web 应用程序分离开来。它阻止从一个域上加载的脚本获取或操作另一个域上的文档属性,收到请求的URL 的域必须与当前Web页面的域相同。也就是说,如果多个窗口或框架中的一些应用程序是从不同的服务器下载的,那么它们无法相互访问数据和脚本,这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。
这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。在所有主要浏览器实现中都有执行。
注意,同源策略只能应用于HTML文档。通过 <script src="..." >
标记导入HTML文档的JavaScript文件被认为是该HTML文档的同源的一部分。
何谓同源
一般地,同源是指同一个协议,同一个端口,同一个主机。
html有个属性:document.domain可以更改当前页面的域,从而可以扩大同源的范围到同一个域名下。但是这个更改有个限制,即只能是当前主机的一部分。
避免同源策略
主要方案有两个:
1. 使用代理:让Web页面向它的源服务器请求数据,并且让Web服务器像代理一样将请求转发给真正的第三方服务器。该方法简单实用,获得了普遍使用,但是它不可伸缩。
2. 使用JSON:注意到同源策略不阻止动态脚本插入,所以我们可以使用<script src="...">的方式来获取数据。这个方法同样不可以加载不同源的html文档,但是,可以返回JSON对象。目前比较通用的做法,是通过一个JSONP的方法。
JSON、JSONP和jQuery
JSON=JavaScript Object Notation
JSONP=JSON with Padding
jQuery中有很多JSONP的例子。