SecurityError: Ошибка № 2122 при загрузке содержимого из перенаправленного изображения

Это происходит во многих случаях при загрузке контента из Интернета, но для нас это чаще всего загрузка изображений с помощью быстрого вызова графа 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».


person seaders    schedule 27.07.2013    source источник


Ответы (2)


Несмотря на другие ответы, предлагающие что-то столь же простое, как:

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;
            }
        }
    }
}
person seaders    schedule 27.07.2013
comment
отправленный вами код фактически не загрузит файл политики. Причиной этого является ваша переменная loaderDomain, которая на самом деле содержит не домен, а URL-адрес. Таким образом, выполнение Security.loadPolicyFile(loaderDomain + 'crossdomain.xml'); без извлечения фактического домена не сработает. - person Martin Asenov; 06.07.2014

если вам не нужно манипулировать пикселями с загруженным объектом изображения BitmapData, вы можете просто удалить context из loader.load

но без context.checkPolicyFile = true вы не сможете добавить smoothing к изображению

person kutu    schedule 31.07.2013