【问题标题】:"SecurityError: Error #2122" on loading content from a redirected image从重定向图像加载内容时出现“SecurityError:错误 #2122”
【发布时间】:2013-07-27 20:02:06
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 flash redirect cross-domain-policy


    【解决方案1】:

    如果您不需要使用加载的图像BitmapData 对象来操作像素,那么您可以从loader.load 中删除context

    但如果没有context.checkPolicyFile = true,您将无法将smoothing 添加到图像中

    【讨论】:

      【解决方案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;
                  }
              }
          }
      }
      

      【讨论】:

      • 您提交的代码实际上不会加载策略文件。原因是您的 loaderDomain 变量实际上并不包含域,而是 url。所以在不提取实际域的情况下执行Security.loadPolicyFile(loaderDomain + 'crossdomain.xml'); 是行不通的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      相关资源
      最近更新 更多