Security.allowDomain的解决方法

时间:2013-02-08 07:51:31

标签: actionscript-3 flash flex actionscript flex4

我有多个SWF文件应该从外部服务器访问。为了能够做到这一点,我需要在每个SWF文件中都有Security.allowDomain。这里的问题是我没有FLA用于那些文件,并且有数千个SWF。

如果有更好的方法可以将这些文件配置为可从其他域访问? 就像拥有某种配置文件一样。

1 个答案:

答案 0 :(得分:2)

是的,有一种解决方法,但我认为这是一个安全漏洞,所以它可以在任何版本的Flash播放器中修复。同时它现在可以使用,所以这里是解决方案 - 使用URLLoaderBINARY dataFormat作为swf字节的预加载器:

swf没有脚本编写的安全权限:

package
{
import flash.display.MovieClip;


public class astest extends MovieClip
{
    public function astest()
    {
    }

    public function externalCheck():void
    {
        graphics.beginFill(0xFF0000);
        graphics.drawCircle(100, 100, 100);
    }
}
}

想要加载前一个swf并调用externalCheck方法的加载程序swf:

package
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;

public class astest2 extends MovieClip
{
    private var loader:Loader;
    private var urlLoader:URLLoader;

    public function astest2()
    {
        init();
    }

    //this method works fine
    protected function init():void
    {
        urlLoader = new URLLoader();
        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader.load(new URLRequest("http://domain_with_your_swfs/astest.swf"));

        urlLoader.addEventListener(Event.COMPLETE, function(event:Event):void
        {
            addChild(loader = new Loader());

            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
            loader.loadBytes(urlLoader.data as ByteArray);
        });
    }

    //this method will fire SecurityError when calling the 'externalCheck' method
    protected function init2(event:Event = null):void
    {
        addChild(loader = new Loader());

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
        loader.load(new URLRequest("http://domain_with_your_swfs/astest.swf"));
    }

    protected function onLoader(event:Event = null):void
    {
        var swf:Object = loader.content;
        swf.externalCheck();
    }


}
}

不要忘记将crossdomain.xml文件放在服务器的根目录中并加载swf文件,如果没有它,URLLoader将无法加载字节,这是唯一的安全要求。