Flash AS3在尝试获取外部swf时获取安全沙箱冲突

时间:2011-04-08 11:52:06

标签: flash actionscript-3 security flash-cs5 sandbox

斐伊川, 我想从另一台服务器加载swf文件到我的flash应用程序。 当我尝试在flash IDE(crl + enter)上加载它时一切正常,但是当我将swf作为独立的swf文件运行或通过调试它时,我收到此错误:

SecurityError: Error #2121: Security sandbox violation: LoaderInfo.content: file:///C|/Users/something/Desktop/blablabla/myplayer.swf cannot access http://www.somedomain.com/blablabla/lalalala/abc.swf. This may be worked around by calling Security.allowDomain.
at flash.display::LoaderInfo/get content()
at wallplayer_fla::MainTimeline/swfLoaded()[wallplayer_fla.MainTimeline::frame1:216]
Cannot display source code at this location.

我的服务器根目录中有crossdomain.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>

在“myplayer.swf”中我有:

Security.allowDomain("*");
Security.allowInsecureDomain("*");
...
...
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
loaderContext.allowCodeImport = true;

ldr = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
ldr.load(new URLRequest(graySwfFilename), loaderContext);
...
...
var mcExt;
var ldr:Loader;
function swfLoaded(e:Event):void {
    mcExt = MovieClip(ldr.contentLoaderInfo.content);
    ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfLoaded);
    mcExt.x = 0;
    mcExt.y = 0;
    addChild(mcExt);
}

我真的不知道该怎么办...... 请帮帮忙?

3 个答案:

答案 0 :(得分:9)

解决方案:适用于Flex 4.x(目前为4.6)和Flash Builder中的AS3:

    import flash.system.SecurityDomain;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    var loaderContext:LoaderContext = new LoaderContext();
    loaderContext.applicationDomain = ApplicationDomain.currentDomain;
    loaderContext.securityDomain = SecurityDomain.currentDomain; // Sets the security 

解决错误#2121的上下文

...现在加载您的SWF

loader.load(new URLRequest(webServerWebURL),loaderContext);

答案 1 :(得分:1)

在“全局安全设置”面板中添加您的工作文件夹。这允许您从文件系统中的单个SWF加载外部文件。如果你想让a.swf加载b.swf,即使它们位于同一个文件夹中也是一样的。

这将允许您的SWF读取外部文件。

如果您将SWF上传到服务器,这应该不是问题。

答案 2 :(得分:0)

您的错误来自没有跨域文件的外部位置,而不是您。在using a bridge file to communicate with an external api上查看本教程。我在这个例子中使用了as3和php。诀窍是保持对域上跨域文件的控制。然后让您的服务器与API通信。