Actionscript 3 Flash中的跨域问题

Actionscript 3 Flash中的跨域问题,actionscript-3,flash,Actionscript 3,Flash,我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。a、 swf正在加载b.swf并试图将其转换到某个接口。当这两个swf文件都在同一个域下时,一切正常。但是,当它们位于不同的域中时,在将b.swf强制转换到实现的接口IComponent之后,我会得到null。这两个SWF都是使用use network=true和相同的IComponent.as编译的 public class Wrapper extends Sprite { public func

我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。a、 swf正在加载b.swf并试图将其转换到某个接口。当这两个swf文件都在同一个域下时,一切正常。但是,当它们位于不同的域中时,在将b.swf强制转换到实现的接口IComponent之后,我会得到null。这两个SWF都是使用use network=true和相同的IComponent.as编译的

public class Wrapper extends Sprite
{
    public function Wrapper()
    {
        super();
        var request:URLRequest = new URLRequest("http://aaa.com/Component.swf");
        var loaderContext:LoaderContext = new LoaderContext();
            loaderContext.applicationDomain = ApplicationDomain.currentDomain;
        var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
            loader.load(request,loaderContext);
            addChild(loader);
    }

    private function onLoadingComplete(event:Event):void
    {
        var target:LoaderInfo = event.target as LoaderInfo;
        var component:IComponent = target.content as IComponent;
            component.init({"s":1});
            component.run();    
    }

}

public class Component extends Sprite implements IComponent
{
    public function Component()
    {
        super();
        Security.allowInsecureDomain("*");
    }

    public function init(params:Object):void
    {
        //some actions
    }

    public function run():void
    {
        //some actions
    }

}

我关于语法错误的想法毫无意义,这里有一个编辑:

此代码:

    private function ololo():void{
        var request:URLRequest = new URLRequest("http://domain/file.swf");
        var loaderContext:LoaderContext = new LoaderContext();
            loaderContext.applicationDomain = ApplicationDomain.currentDomain;
        var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
            loader.load(request,loaderContext);
    }

    private function onLoadingComplete(e:Event):void {
        var target:LoaderInfo = e.target as LoaderInfo;
        addChild(target.content as Sprite);
    }
即使文件位于完全不同的域上,也可以正常工作

如果将您的
i组件
视为
Sprite
,它是否有效?

也许您必须通过crossdomain.xml文件设置跨域安全策略

例如:

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

试试这个:

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true , ApplicationDomain.currentDomain )
它不起作用的原因似乎与IComponent未被识别或存在定义冲突这一事实有关。我本以为ApplicationDomain设置为currentDomain时,应该避免定义冲突。。。但将每个主权财富基金留在各自的领域可能是值得的

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true );
您还可以在加载其他SWF之前检查IComponent是否“存在”。这有助于诊断发生了什么

 var ClassName:Object = getDefinitionByName('IComponent');
 trace( ClassName );

谢谢大家的回答,我今天找到了一个有效的解决方案。 我不是将加载的内容强制转换为IComponent,而是将其强制转换为object

var component:Object = (event.target as LoaderInfo).content as Object;
    component["init"](null);
component["run"]();
我从测试中证实,即使我们使用带有静态字段和方法的共享类,它也不起作用。包装器和组件都在实例化它们自己的共享类实例。真奇怪


如果您有相同的问题,请确保您的包装器/组件类具有安全性。allowDomain调用

这是播放机中的一个错误:

当您尝试在从不同域加载的主权财富基金之间“共享”接口时,就会发生这种情况。如果你将两个主权财富基金放在同一个应用程序域下(正如你所做的那样),这应该是可行的

使用对象是可行的,但有点违背了使用接口的初衷

这里有一个解决方法,基本上是将swf作为二进制文件加载,然后使用
Loader::loadBytes
将swf实际加载到内存中:


我假设Wrapper是a.swf的文档类,Component是b.swf的文档类。target.content是否正在加载?你能查出来吗?是的。包装器正在加载组件,然后试图将其强制转换为IComponent(您的代码与我的代码完全相同。)强制转换为Sprite不是一个好主意。@Pul Yuriychuck如果您将其视为Sprite,那么您的代码是否有效?我认为这是有用的信息实际上是精灵,但我的代码似乎无法将精灵投射到IComponent接口。接口对我来说更重要,我需要调用组件方法;并且得到了SecurityError异常,因此您的假设是正确的。谢谢您的想法,我希望这会有所帮助。;)Wrapper.swf和Component.swf都是使用完全相同的IComponent接口编译的,没有定义冲突。尽管如此,我还是会尝试使用getDefinitionByName来确定。非常感谢您提出了问题的根本原因。当父swf文件和子swf文件托管在同一域下时,接口工作正常。