Actionscript 3 &引用;安全性错误:错误“2122”;从重定向图像加载内容时

Actionscript 3 &引用;安全性错误:错误“2122”;从重定向图像加载内容时,actionscript-3,flash,redirect,cross-domain-policy,Actionscript 3,Flash,Redirect,Cross Domain Policy,这在很多情况下都会发生在从web加载内容时,但对我们来说,最常见的是通过Facebook的图形快捷调用加载图像 简单到: package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import f

这在很多情况下都会发生在从web加载内容时,但对我们来说,最常见的是通过Facebook的图形快捷调用加载图像

简单到:

package
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;

    public class RedirectTestFail extends Sprite
    {
        private const url:String = 'https://graph.facebook.com/4/picture';
        private const context:LoaderContext = new LoaderContext(true);

        public function RedirectTestFail()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            loader.load(new URLRequest(this.url), this.context);
        }

        protected function onComplete(event:Event):void
        {
            this.addChild((event.target as LoaderInfo).content);
        }
    }
}
Security.loadPolicyFile("https://fbcdn-profile-a.akamaihd.net/crossdomain.xml");

给出了一个可怕的“SecurityError:Error#2122”错误。

尽管其他答案建议如下:

package
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;

    public class RedirectTestFail extends Sprite
    {
        private const url:String = 'https://graph.facebook.com/4/picture';
        private const context:LoaderContext = new LoaderContext(true);

        public function RedirectTestFail()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            loader.load(new URLRequest(this.url), this.context);
        }

        protected function onComplete(event:Event):void
        {
            this.addChild((event.target as LoaderInfo).content);
        }
    }
}
Security.loadPolicyFile("https://fbcdn-profile-a.akamaihd.net/crossdomain.xml");
这并不清楚,也不够全面。Facebook有不同的图像服务器,这是我以前使用过的。这可能被认为是一个Flash播放器错误,我接受,但出于安全考虑,我可以理解他们默认情况下不允许重定向,因为你应该自己处理

我现在用下面的。您尝试执行正常行为,但将其包装为try/catch for SecurityError。如果抛出了一个,请捕获它,如果loaderInfo的域与您请求的域不同,请在其上运行“Security.allowDomain”和“Security.loadPolicyFile”,并尝试再加载一次。这在实践中非常有效,只需很少的开销

package
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;
    import flash.system.Security;

    public class RedirectTest extends Sprite
    {
        private const url:String = 'https://graph.facebook.com/4/picture';
        private const context:LoaderContext = new LoaderContext(true);

        public function RedirectTest()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            loader.load(new URLRequest(this.url), this.context);
        }

        protected function onComplete(event:Event):void
        {
            try
            {
                this.addChild((event.target as LoaderInfo).content);
            } 
            catch(error:SecurityError) 
            {
                trace(error);
                var loaderInfo:LoaderInfo = (event.target as LoaderInfo);
                var loaderDomain:String = loaderInfo.loader.contentLoaderInfo.url;
                if(-1 == this.url.indexOf(loaderDomain))
                {
                    Security.loadPolicyFile(loaderDomain + 'crossdomain.xml');
                    if( 0 == loaderDomain.indexOf('https') )
                    {
                        Security.allowDomain(loaderDomain);
                    }
                    else
                    {
                        Security.allowInsecureDomain(loaderDomain)
                    }

                    loaderInfo.loader.load(new URLRequest(this.url), this.context);
                    return;
                }
                throw error;
            }
        }
    }
}

如果不需要使用加载的图像
位图数据
对象操作像素,则只需从
加载程序中删除
上下文
。加载


但是如果没有
context.checkPolicyFile=true
您将无法向图像添加
平滑
,您提交的代码实际上不会加载策略文件。原因是loaderDomain变量实际上并不包含域,而是包含url。这样做
Security.loadPolicyFile(loaderDomain+'crossdomain.xml')将不起作用