用document.domain解决Ajax跨子域

因为浏览器的安全策略,浏览器不允许不同域(比如:dancewithnet.com和lab.dancewithnet.com)、不同协议(比如:http://dancewithnet.com和https://dancewithnet.com)、不同端口(比如:http:dancewithnet.com和http://dancewithnet.com:8080)下的页面通过XMLHTTPRequest相互访问,这个问题同样影响着不同页面的Javascript的相互调用和控制,但是当主域、协议、端口相同时,通过设置页面的document.domain主域,Javascript可以在不同的子域名间访问控制,比如通过设置document.domain=’dancewithnet.com’,http://dancewithnet.com和http://lab.dancewithnet.com页面可互访,这个特性也提供了此情况下不同子域名下的XMLHTTPRequest相互访问的解决方案。

对于主域、协议、端口相同时的Ajax跨域问题,很早就有设置document.domain来解决的说法,但一直没有看到具体的成功应用,这几天尝试了一下,其原理就是,利用一个隐藏的iframe引入所跨另一子域的页面作为代理,通过Javascript来控制iframe引入的另一子域的XMLHTTPRequest来进行数据获取。请看实例>>

对于不同主域/不同协议/不同端口下的Ajax访问需要通过后台的代理来实现,更多细节可以看看Use a Web Proxy for Cross-Domain XMLHttpRequest CallsFixing AJAX: XMLHttpRequest Considered Harmful

标签:, ,

作者:秦歌,时间:2007-07-22 17:38,归纳于:Javascript & DOM & AJAX,订阅:RSS 2.0,引用:Trackback

有评论 12 条,发表一条新评论 »

灼冰说:2007-07-25 17:06 #1

好久不写生活了……

火星人的fans说:2007-07-26 13:13 #2

嗯,而且还总写俺看不懂的东西

kakawar说:2007-08-08 20:03 #3

佩服佩服,长见识了。

火星人路人甲说:2007-11-06 14:12 #4

哎!!!!~~ 有现成的例子么 ,理论实在是太空洞了~~~~~~~

秦歌说:2007-11-06 16:21 #5

有例子啊,原文中有实例,看来我的链接做的不够明显,失败。

会做饭的仓鼠说:2007-11-07 9:10 #6

靠一百遍,ls的ls是傻鸟+瞎子,最烦这种cuo人了

justok说:2009-04-07 11:08 #7

总结得很精炼。如果可以,我转载了

conis说:2009-10-16 16:52 #8

我使用的ff3及ie8,结果表明第一个方式都不能跨域名,而使用代理是可以的

秦歌说:2009-10-17 10:26 #9

@conis:呵呵,第1种方法就是用来和第2种方法做对比的,目的就是为了说明直接跨域不行,需要用代理。不过,Firefox3.5和IE8有一些新特性,等我有空了可以研究研究或许有方便方法。

Kevin yang说:2009-12-01 16:29 #10

子域的情况相对还算简单,只是要考虑一个问题,就是必须iframe加载完document.domain这句脚本执行才可用,否则你的ajax脚本一执行就会出错,这个一个潜在的风险

用document.domain解决Ajax无法跨域问题 | haohtml's blog说:2010-08-09 19:37 #11

[...] <h1>用document.domain解决Ajax跨子域</h1> <h3><a href=”http://dancewithnet.com/2007/07/22/solve-cross-sub-domain-ajax-with-document-domain/“>说明</a>|<a [...]

枫芸志 » 【Javascript】利用document.domain解决子域跨域访问问题说:2012-01-09 7:25 #12

[...] 用document.domain解决Ajax跨子域 [...]

发表一条评论

您可以在下面评论内容中使用下列XHTML标签:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


回到页眉