码迷,mamicode.com
首页 > 其他好文 > 详细

跨域访问实现依据

时间:2015-09-21 12:01:23      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

首先要弄清楚域是含义。这里引用百度知道里的域的一个概念说明:

域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。

信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,

还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。

有一种简明的说法来解释广域跨域:跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,

包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。

 

在广域网环境中,由于浏览器的安全限制,网络连接的跨域访问时不被允许的,XmlHttpRequest也不例外。但有时候跨域访问资源是必需的。

 

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。

这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。同源策略不阻止将动态脚本元素插入文档中。

 

参考理论一:在浏览器中不能直接来跨域访问,而在服务器端没有跨域安全限制。

 

这样的话,可以在服务端完成跨域访问,而在客户端来取得结果就可以了。

 

参考理论二:同源策略不阻止动态脚本元素插入,脚本访问可以跨域。

 

以下直接引用:

具体情况有:

一、本域和子域的相互访问: www.aa.com和book.aa.com

二、本域和其他域的相互访问: www.aa.com和www.bb.com 用 iframe

三、本域和其他域的相互访问: www.aa.com和www.bb.com 用 XMLHttpRequest访问代理

四、本域和其他域的相互访问: www.aa.com和www.bb.com 用 JS创建动态脚本

 

解决方法:

一、如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。

可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和iframe里面都加上document.domain = "aa.com",

这样就可以统一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。(这个办法我没有尝试,不过理论可行)

 

二、当两个域不同时,如果想相互调用,那么同样需要两个域都是由你来开发才可以。用iframe可以实现数据的互相调用。

解决方案就是用window.location对象的hash属性。hash属性就是http://domian/web/a.htm#dshakjdhsjka 里面的#dshakjdhsjka。

利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信。不过除了IE之外其他大部分浏览器只要改变hash就会记录历史,

你在前进和后退时就需要处理,非常麻烦。不过再做简单的处理时还是可以用的。大体的过程是页面a和页面b在不同域下,

b通过iframe添加到a里,a通过JS修改iframe的hash值,b里面做一个监听(因为JS只能修改hash,数据是否改变只能由b自己来判断),

检测到b的hash值被修改了,得到修改的值,经过处理返回a需要的值,再来修改a的hash值

(这个地方要注意,如果a 本身是那种查询页面的话比如http://domian/web/a.aspx?id=3,在b中直接parent.window.location是无法取得数据的,

同样报没有权限的错误,需要a把这个传过来,所以也比较麻烦),同样a里面也要做监听,如果hash变化的话就取得返回的数据,再做相应的处理。

 

三、这种情形是最经常遇到的,也是用的最多的了。就是www.aa.com和www.bb.com你只能修改一个,也就是另外一个是别人的,

人家告诉你你要取得数据就访问某某连接参数是什么样子的,最后返回数据是什么格式的。而你需要做的就是在你的域下新建一个网页,

让服务器去别人的网站上取得数据,再返回给你。domain1下的a向同域下的GetData.aspx请求数据,

GetData.aspx向domain2下的 ResponseData.aspx发送请求,ResponseData.aspx返回数据给GetData.aspx,

GetData.aspx再返回给a,这样就完成了一次数据请求。GetData.aspx在其中充当了代理的作用。

 

四、这个和上个的区别就是请求是使用<script>标签来请求的,这个要求也是两个域都是由你来开发才行

。原理就是JS文件注入,在本域内的a 内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面b,b返回数据即可,

可以直接返回JS的代码。因为script的src属性是可以跨域的。

 

 

总结:

第一种情况:域和子域的问题,可以完全解决交互。

第二种情况:跨域,实现过程非常麻烦,需要两个域开发者都能控制,适用于简单交互。

第三种情况:跨域,开发者只控制一个域即可,实现过程需要增加代理取得数据,是常用的方式。

第四种情况:跨域,两个域开发者都需要控制,返回一段js代码。

 

参考:

http://blog.csdn.net/axzywan/archive/2009/01/19/3837311.aspx

http://www.liehuo.net/a/200912/0111192.html

http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/index.html#intro

 

本域和子域之间的跨域访问具体说明:

多数情况下,只有相同域下的页面才能相互作用。比如,一个位于 www.microsoft.com 域下的页面,

可以自由地通过 JavaScript 读写 www.microsoft.com 域下的其它页面,但却不能读写 home.microsoft.com 域下的页面,

或是 www.google.com 域下的页面。完全的跨域访问(比如,www.microsoft.com 域下的页面访问 www.google.com 域下的页面),

在 JavaScript 开发中是被完全禁止的,没有任何商量的余地。但是,DOM 为 document 对象提供了一个 domain 属性,

可以授权“同主域但不同子域”页面间的数据访问,这正好可以应付那些“集团军”式的前台部署。 

跨子域设置的规则:当两个二级域名,URL 协议,端口都相同的网页,自身都通过 JavaScript 显示地设置了相同的 document.domain 值,

并且此值至少等于自身的二级域名,它们之间才可以相互作用。(注意,此规则只适用大于二级域名的页面,并且千万别指望 http 页面可以与 https 页面相互作用。) 

也就是说,当网页作者指定 document.domain 属性为域名的后半部分时,读写许可将扩展至二级域名。

例如:http://www.microsoft.com 下的某个页面,将 document.domain 属性设置成 microsoft.com,

同时 http://home.microsoft.com 下的某个页面,也将 document.domain 属性设置成 microsoft.com,

它们之间即可完成跨子域的访问。因为,只有以 microsoft.com 结尾的站点上的文档,才可能将其 document.domain 属性设置为 microsoft.com,

这样就确保了同一个服务提供者的页面,才能互相提供权限,从而完成交互操作。 

注意,document.domain 属性值不能比二级域名更短(比如“com”,浏览器将禁止这种设置,并认为此操作是无效的)。

但是,对于如 www.microsoft.co.jp 这样的域名,实际的最大操作权限应该是二级域名 microsoft.co.jp(而不是一级域名“co.jp”,

浏览器不会像限制“com”那样,将“co.jp”认为是无效的。但如果你真这样做了,带来的风险可想而知)。 

在窗口、对话框、框架(frameset,frame,iframe),甚至是 IE 的 popup 窗口之间(通过 IE 特有的 window.createPopup 方法创建),

只要它们涉及到了相互读写,都要考虑 document.domain 问题。这仿佛是“一损俱损,一荣俱荣”的事情,

一旦你在某个地方设置了 document.domain,你必须小心应对。因为,你不知道在哪个角落里,会出现“没有权限”的脚本错误。

跨域访问实现依据

标签:

原文地址:http://www.cnblogs.com/shijiaoyun/p/4825355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!