4

这种情况在从网络加载内容时经常发生,但对我们来说,最常见的是通过 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);
        }
    }
}

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

4

2 回答 2

1

尽管其他答案暗示了一些简单的事情:

Security.loadPolicyFile("https://fbcdn-profile-a.akamaihd.net/crossdomain.xml");

这不是很清楚,也不够全面。Facebook 有不同的图像服务器,我以前也遇到过。这可能被视为 Flash Player 错误,我会接受,但出于安全考虑,我可以理解他们默认不允许重定向,因为您应该自己处理。

我现在在下面使用。你尝试做你的正常行为,但将它包装在一个 try/catch 中以获取 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;
            }
        }
    }
}
于 2013-07-27T16:45:38.897 回答
0

如果您不需要使用加载的图像BitmapData对象来操作像素,那么您可以contextloader.load

但没有context.checkPolicyFile = true你将无法添加smoothing到图像

于 2013-07-31T10:42:47.387 回答