Flash中的跨域问题

时间:2010-12-06 17:12:33

标签: actionscript-3 flash

我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。 a.swf正在加载b.swf并尝试将其转换为某个接口。当这两个swf文件都在同一个域下时,一切正常。但是当它们位于不同的域下时,在将b.swf转换为已实现的接口IComponent后,我将变为null。这两个swfs都是使用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
    }

}

5 个答案:

答案 0 :(得分:1)

试试这个:

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true , ApplicationDomain.currentDomain )

似乎它不工作的原因与IComponent未被识别或存在定义冲突的事实有关。我原以为将ApplicationDomain设置为currentDomain,应该避免定义冲突......但是可能值得尝试将每个SWF保留在自己的域中。

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true );

您还可以在加载其他SWF之前检查IComponent是否“存在”。这有助于诊断正在发生的事情......

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

答案 1 :(得分:0)

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

http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

例如:

<?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>

答案 2 :(得分:0)

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

var component:Object = (event.target as LoaderInfo).content as Object;
    component["init"](null);
component["run"]();

我从测试中得知,即使我们使用静态字段和方法的共享类,它也不起作用。包装器和组件都实例化它们自己的共享类实例。真的很奇怪。

如果您遇到同样的问题,请确保您的包装器/组件类具有Security.allowDomain调用

答案 3 :(得分:0)

这是播放器中的错​​误:

http://bugs.adobe.com/jira/browse/ASC-3529

当您尝试“共享”从不同域加载的swfs之间的接口时,会发生这种情况。如果您将两个swfs放在同一个应用程序域下(如您所示),这应该可以工作。

使用对象可以工作,但首先会破坏使用接口的目的。

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

http://blog.aleksandarandreev.com/?p=42

答案 4 :(得分:-1)

我对语法错误的看法毫无意义,这是一个编辑:

此代码:

    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);
    }
即使文件位于完全不同的域上,

也能正常工作。
如果您将IComponent视为Sprite

,它会有效吗?