关于允许跨域 SWF 文件间的数据访问

一个 SWF 文件可以从 Internet 上的任何位置加载另一个 SWF 文件。但是,为了使两个 SWF 文件能够访问彼此的数据(变量和对象),这两个文件必须源于同一个域。默认情况下,在 Flash Player 7 和更高版本中,这两个域必须完全匹配才能实现两个文件共享数据。但是,SWF 文件可以通过调用 LocalConnection.allowDomainSystem.security.allowDomain() 向从特定域提供的 SWF 文件授予访问权限。

例如,假设 main.swf 是从 www.macromedia.com 提供的,随后该 SWF 文件将来自
data.macromedia.com 的另一个 SWF 文件 (data.swf) 加载到影片剪辑实例 (target_mc) 中。

// 在 macromedia.swf 中
target_mc.loadMovie("http://data.macromedia.com/data.swf");

此外,假设 data.swf 在其主时间轴上定义名为 getData() 的方法。默认情况下,一旦 data.swf 进行了加载,main.swf 就不能调用该文件中定义的 getData() 方法。这是因为两个 SWF 文件不在相同的域中。例如,在 data.swf 完成加载之后,main.swf 中的以下方法调用将失败。

// 在 macromedia.swf 中,在加载了 data.swf 之后:
target_mc.getData(); // 此方法调用将失败

但是,data.swf 可以使用 LocalConnection.allowDomain 处理函数或System.security.allowDomain() 方法向从 www.macromedia.com 提供的 SWF 文件授予访问权限,具体取决于所需的访问类型。以下代码在被添加到 data.swf 之后将允许从 www.macromedia.com 提供的 SWF 文件访问其变量和方法:

// 在 data.swf 中
System.security.allowDomain("www.macromedia.com");
my_lc.allowDomain = function(sendingDomain) {  
  return(sendingDomain=="www.macromedia.com");
}

请注意,allowDomain 允许被授予权限的域中的任何 SWF 文件撰写允许该权限的域中的任何其它 SWF 文件的脚本,除非被访问的 SWF 文件位于使用安全 (HTTPS) 协议的站点。在此情况下,您必须使用 allowInsecureDomain,而不是 allowDomain;请参见关于允许 SWF 文件间 HTTP 对 HTTPS 协议的访问

有关域名匹配的更多信息,请参见Flash Player 安全功能