如何使用 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
ActionScript 3 从Flash文件(AS3)调用Javascript(JS)函数