我在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()
有没有办法让这段代码有效?
答案 0 :(得分:6)
第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文件的脚本权限。
更详细地介绍了图表和所有内容。
答案 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是你需要的吗?