2

我有一个托管在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()

有什么办法可以让这段代码工作吗?

4

3 回答 3

6

这在第 550 页的 Adob​​e 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 文件编写脚本的权限。

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

于 2008-08-18T09:59:50.697 回答
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/的代码示例

于 2008-08-18T10:03:36.630 回答
0

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

于 2008-08-18T09:36:26.063 回答