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

时间:2008-08-18 08:53:39

标签: flex flash actionscript-3 security

我在http://www.a.com/a.swf托管了一个Flex swf。 我在另一个尝试加载SWF的doamin上有一个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()

有没有办法让这段代码有效?

3 个答案:

答案 0 :(得分:6)

第550页的The Adobe Flex 3 Programming ActionScript 3 PDF(第27章:Flash Player安全/跨脚本编写)中对此进行了描述:

  

如果使用ActionScript 3.0编写的两个SWF文件是从不同的域提供的 - 例如http://siteA.com/swfA.swfhttp://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文件的脚本权限。

更详细地介绍了图表和所有内容。

答案 1 :(得分: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/

答案 2 :(得分:0)

可能System.Security.allowDomain是你需要的吗?