如何使用 Flash (AS3) 从远程域调用 Flex SWF?

Posted

技术标签:

【中文标题】如何使用 Flash (AS3) 从远程域调用 Flex SWF?【英文标题】:How do I call a Flex SWF from a remote domain using Flash (AS3)? 【发布时间】:2010-09-06 01:46:33 【问题描述】:

我在 http://www.a.com/a.swf 上托管了一个 Flex swf。 我在另一个尝试加载 SWF 的域上有一个 flash 代码:

_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);

在 onLoaderFinish 事件中,我尝试从远程 SWF 加载类并创建它们:

_loader.contentLoaderInfo.applicationDomain.getDefinition("someClassName") as Class

当这段代码运行时,我得到以下异常

SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.
    at flash.display::LoaderInfo/get applicationDomain()
    at NuconomyLoader/onLoaderFinish()

有什么方法可以让这段代码正常工作吗?

【问题讨论】:

【参考方案1】:

这一切都在第 550 页的The Adobe Flex 3 Programming ActionScript 3 PDF 中进行了描述(第 27 章:Flash Player 安全性/跨脚本):

如果两个使用 ActionScript 3.0 编写的 SWF 文件来自不同的域(例如,http://siteA.com/swfA.swf 和 http://siteB.com/swfB.swf),则默认情况下,Flash Player 不允许 swfA.swf 编写 swfB.swf 的脚本,也不允许 swfB。 swf 脚本 swfA.swf。 SWF 文件通过调用 Security.allowDomain() 授予对来自其他域的 SWF 文件的权限。通过调用 Security.allowDomain("siteA.com"),swfB.swf 授予来自 siteA.com 的 SWF 文件编写脚本的权限。

它更详细地进行了,包括图表和所有内容。

【讨论】:

【参考方案2】:

您需要在服务器上有一个 crossdomain.xml 策略文件,该文件包含您加载的文件,它应该看起来像这样:

<?xml version="1.0"?>
<!-- http://www.foo.com/crossdomain.xml -->
<cross-domain-policy>
  <allow-access-from domain="www.friendOfFoo.com" />
  <allow-access-from domain="*.foo.com" />
  <allow-access-from domain="105.216.0.40" />
</cross-domain-policy>

将它作为 crossdomain.xml 放在您要从中加载的域的根目录中。

你还需要设置加载器来读取这个文件:

var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onComplete );
loader.load( new URLRequest( "http://my.domain.com/image.png" ), loaderContext );

来自http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/的代码示例

【讨论】:

【参考方案3】:

也许System.Security.allowDomain 是你需要的?

【讨论】:

以上是关于如何使用 Flash (AS3) 从远程域调用 Flex SWF?的主要内容,如果未能解决你的问题,请参考以下文章

将数组从 Flash (AS3) 发送到 JavaScript

Flash AS3:调用javascript函数

如何设置和使用 Flash AS3 文件

ActionScript 3 从Flash文件(AS3)调用Javascript(JS)函数

ActionScript 3 AS3:从Flash调用Google的Urchin跟踪器

Flash AS3 - 当数组已经调用时,下一步我应该怎么做?