SWF 文件之间的跨域和子域访问

在开发彼此通讯的一系列 SWF 文件时(例如,在使用 loadMovie()MovieClip.loadMovie()MovieClipLoader.LoadClip() 或本地连接对象时),可以在不同的域中承载影片,或者在一个超域的不同子域中承载影片。

在以 Flash Player 5 或更低版本为目标播放器发布的文件中,对跨域或子域访问没有限制。

在以 Flash Player 6 为目标播放器发布的文件中,可以使用 LocalConnection.allowDomain 处理函数或 System.security.allowDomain() 方法指定允许的跨域访问(例如,让 someOtherSite.com 上的文件可以访问 someSite.com 上的文件),并且不需要执行任何命令就允许子域访问(例如,store.someSite.com 上的文件可以访问 www.someSite.com 上的文件)。

对于以 Flash Player 7 为目标播放器发布的文件,其实现 SWF 文件间访问的方式有两点与早期版本不同。首先,Flash Player 7 实现完全域匹配规则,而不是超域匹配规则。因此,所访问的文件(即使该文件是以早于 Flash Player 7 的 Player 版本为目标播放器发布的)必须显式允许跨域或子域访问;在下文将讨论这一主题。其次,在某一使用安全协议 (HTTPS) 的站点承载的文件必须显式允许从使用不安全协议(HTTP 或 FTP)的站点承载的文件的访问;在下一节中将讨论这一主题(请参见SWF 文件之间的 HTTP 到 HTTPS 协议访问)。

因为 Flash Player 7 实现完全域匹配规则,而不是超域匹配规则,所以,如果您希望从以 Flash Player 7 为目标播放器发布的文件访问现有脚本,则可能需要修改这些脚本。(您仍可以 Flash Player 6 为目标播放器发布这些修改后的文件)。如果您在文件中使用了任何
LocalConnection.allowDomain()System.security.allowDomain() 语句并且指定了允许的超域站点,则必须更改参数以改为指定完全域匹配。以下代码显示您可能要进行的几类更改的示例:

// 位于 www.anyOldSite.com 的 SWF 文件中的 Flash Player 6 命令
// 要允许由在 www.someSite.com
// 或在 store.someSite.com 承载的 SWF 文件访问
System.security.allowDomain("someSite.com");
my_lc.allowDomain = function(sendingDomain) {  
  return(sendingDomain=="someSite.com");
}
// 允许由以 Flash Player 7 为目标播放器发布的 SWF 文件
// 访问的相应命令
System.security.allowDomain("www.someSite.com", "store.someSite.com");
my_lc.allowDomain = function(sendingDomain) {  
  return(sendingDomain=="www.someSite.com" ||
    sendingDomain=="store.someSite.com");
}

如果您当前没有使用如下语句,可能还需要将这些语句添加到您的文件中。例如,如果您的 SWF 文件承载在 www.someSite.com 中并且想要允许由 store.someSite.com 上以 Flash Player 7 为目标播放器发布的 SWF 文件访问该文件,则必须将如下语句添加到 www.someSite.com 上的文件(您仍可以 Flash Player 6 为目标播放器发布 www.someSite.com 上的文件)。

System.security.allowDomain("store.someSite.com");
my_lc.allowDomain = function(sendingDomain) {  
  return(sendingDomain=="store.someSite.com");
}

总之,如果您以 Flash Player 7 为目标播放器发布满足以下条件的文件,则可能需要修改文件以添加或更改 allowDomain 语句:

您需要进行以下更改: