Orbited (Comet 服务器)的客户端 JS 组件,要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行
document.domain = document.domain;
在加载任何其他 JS 之前。(请参阅文档。)
这是做什么的?它看起来像一个NOOP!(我已经检查过,实际上是必要的。)
我实际上写了这段代码。
尝试跨子域/端口彗星时,iframe 需要与document.domain
父框架具有相同的值。document.domain
不幸的是,浏览器在内部为原始值存储了域名和端口。但是 javascript 中的 getter 和 setter 对端口一无所知。所以问题是这样的:如果顶部框架document.domain
是('example.com', 80)
,底部框架是('comet.example.com', 80)
,你如何让底部框架也('example.com', 80)
一样?
你不能,因为更改主机名部分必然会导致端口设置为null
,所以你能做的最好的就是('example.com', null)
在底部框架中。所以顶部框架也需要设置为该值,设置document.domain=document.domain
就是这样做的。它将浏览器中的内部表示从 更改('example.com', 80)
为('example.com', null)
,然后一切匹配,跨端口/子域框架通信正常工作。
浏览器区分(a)未显式设置的 document.domain 和(b)显式设置的 document.domain ...即使它们返回相同的值。
显式设置该值表示意图与另一个子域(在同一父域下)上的脚本“合作”。
如果父页面和外部脚本都明确地将 document.domain 设置为相同的值,则可以绕过同源策略限制,并且每个脚本都可以访问彼此上下文的所有(否则受限制的)对象和属性。
我在这个网站上找到了以下信息:devguru。更具体地说,这是引用:
此属性设置或返回文档源自的服务器的域名。这默认为从中检索文档的服务器的域名,但可以更改为该名称的后缀(并且仅是后缀)。这允许在从不同服务器传递的文档之间共享脚本属性、安全性,前提是它们共享相同的域后缀。
在我看来,它允许为同一个域编写跨站点脚本(即使子域不同)。
我想如果你不接触 document.domain,js 引擎只允许来自同一域的其他 javascript。使用该属性,您将能够部署到其他子域,例如轨道文档状态。
如果未明确设置,则从实际 URL中document.domain
提取默认值。浏览器将记录document.domain
URL 是否已作为默认设置或是否已明确设置。两者都必须是同一个域的默认值,或者两者都必须显式设置为同一个域才能正常工作。如果一个是默认的,一个是显式设置的,如果读取都匹配,两个页面仍然会被禁止相互交谈。
请参阅:https ://developer.mozilla.org/en-US/docs/DOM/document.domain