守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 867|回复: 2

[运行时错误] 2123

[复制链接]
回帖奖励 200 金币 回复本帖可获得 2 金币奖励! 每人限 1 次
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51829
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-8 16:53:15 | 显示全部楼层 |阅读模式
    AS3错误码
    错误代码: 2123
    错误消息: 安全沙箱冲突: %1: %2 无法访问 %3。没有已授予访问权限的策略文件。
    错误说明: 安全沙箱冲突: %1: %2 无法访问 %3。没有已授予访问权限的策略文件。
    消息类型: 运行时错误
    异常语句:
    SecurityError: Error #2123: 安全沙箱冲突:Loader.content:http://www.**********/lib.swf 不能访问http://xxx.jpg。未被授权访问任何策略文件。
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51829
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-8 17:47:02 | 显示全部楼层

    第一份安全沙箱的笔记。
    因为安全沙箱困扰了不少人,所以是老生常谈的问题。
    今天下午我遇到了2123错误。

    案发现场

    某个列表flash页面需要支持gravatar的头像
    (gravatar的跨域策略文件位于http://www.gravatar.com/avatar/crossdomain.xml)
    在加载他们提供的图片头像时我遇到了安全沙箱冲突,错误信息是:

    1. SecurityError: Error #2123: 安全沙箱冲突:Loader.content:http://www.**********/lib.swf 不能访问 http://www.gravatar.com/avatar /3b3be63a4c2a439b013787721dfce802.jpg?s=26&d=monsterid。未被授权访问任何策略文件。
    2. at flash.display::Loader/get content()
    3. at org.mousebomb.srcloader::SwfLoader/onLoadComplete()
    复制代码
    一开始我以为是要Crossdomain文件的,我加上了Security.loadPolicyFile(“http://www.gravatar.com/avatar/crossdomain.xml”); 尝试,无效。
    其实并不需要的——我只是要发布到网站后跨域读取并显示图片,这在远程网络域中,是直接允许以只读方式访问视听媒体内容的罪魁祸首后来单独写了一个文件,用Loader测试了一下可以正常读取并显示图片的。
    这样想起来原来导致安全错误的原因在于我所使用的资源加载器,资源池的最终工作单位中Loader是每次加载完成一个就把此视觉对象抛出,然后unload以便再次接受新任务。
    片段代码:
    1. _isFree = true;
    2.             var _loadedData : DisplayObject = _loader.content;
    3.             _loader.unload();
    4.             var outEvent : SrcloaderEvent = new SrcloaderEvent(SrcloaderEvent.COMPLETE, {key:_key, type:_type, data:_loadedData});
    5.             this.dispatchEvent(outEvent);
    复制代码
    这样的抛出视觉对象(错误出现在_loader.content这句)被 Flashplayer看作为“跨域数据处理” ,违反了只读的许可,是不允许的。解决方案这部分直接换成Loader来加载显示就行了。
    针对跨域视听媒体对象的显示与读取只能用Loader直接做容器。[11.8补充]根据我的理解,远程网络域的图像要想进行处理(draw之类),只要服务器上有跨域策略文件标明允许,且loaderContext读取了此策略文件就可以的,但事实上,还是无法操作。
    也许是对安全策略还不够了解,上次的问题虽然解决了却没有深入研究。今天群里有个兄台(pickgliss)为解决问题,提出这样的方式绕过Loader加载来的图片无法draw、无法操作BitmapData的问题:
    先用URLLoader以二进制方式加载图片,然后用Loader.loadBytes加载为显示对象。
    我在后面加上draw位图和smoothing来测试,果然可行!注意:此方法适用于远程服务器上有跨域安全策略赋予权限,但依然无法操作显示对象。不适用于没有跨域安全策略、或者策略文件不允许的情况。如何绕过安全错误例:
    1. package
    2. {
    3.     import flash.display.Bitmap;
    4.     import flash.display.BitmapData;
    5.     import flash.display.DisplayObject;
    6.     import flash.display.Loader;
    7.     import flash.display.Sprite;
    8.     import flash.events.Event;
    9.     import flash.net.URLLoader;
    10.     import flash.net.URLLoaderDataFormat;
    11.     import flash.net.URLRequest;
    12.     import flash.utils.ByteArray;

    13.     public class Test extends Sprite
    14.     {
    15.         public function Test()
    16.         {
    17.             var req : URLRequest = new URLRequest("http://uc.discuz.net/data/avatar/001/29/18/69_avatar_middle.jpg");
    18.             var loader : URLLoader = new URLLoader(req);
    19.             loader.dataFormat = URLLoaderDataFormat.BINARY;
    20.             loader.addEventListener(Event.COMPLETE, __complete);
    21.         }

    22.         private function __complete(e : Event) : void
    23.         {
    24.             var data : ByteArray = e.target.data;
    25.             var loader : Loader = new Loader();
    26.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageDataComplete);
    27.             loader.loadBytes(data);
    28.            
    29.         }

    30.         private function imageDataComplete(e : Event) : void
    31.         {
    32.             var dio : DisplayObject = e.target.content;
    33.             var bmp : Bitmap = new Bitmap(new BitmapData(dio.width, dio.height),"auto",true);
    34.             bmp.bitmapData.draw(dio);
    35.             bmp.x = 100;
    36.             bmp.y = 100;
    37.             bmp.width = 50;
    38.             bmp.height = 50;
    39.             addChild(bmp);
    40.         }
    41.     }
    42. }
    复制代码





    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51829
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 13:40:53 | 显示全部楼层

    案发现场


    某个列表flash页面需要支持gravatar的头像

    (gravatar的跨域策略文件位于http://www.gravatar.com/avatar/crossdomain.xml)

    在加载他们提供的图片头像时我遇到了安全沙箱冲突,错误信息是:


    1. SecurityError: Error #2123: 安全沙箱冲突:Loader.content:http://www.**********/lib.swf 不能访问http://www.gravatar.com/avatar/3b3be63a4c2a439b013787721dfce802.jpg?s=26&d=monsterid。未被授权访问任何策略文件。
    2. at flash.display::Loader/get content()
    3. at org.mousebomb.srcloader::SwfLoader/onLoadComplete()
    复制代码

    一开始我以为是要Crossdomain文件的,我加上了Security.loadPolicyFile(“http://www.gravatar.com/avatar/crossdomain.xml”); 尝试,无效。

    其实并不需要的——我只是要发布到网站后跨域读取并显示图片,这在远程网络域中,是直接允许以只读方式访问视听媒体内容的。


    罪魁祸首


    后来单独写了一个文件,用Loader测试了一下可以正常读取并显示图片的。

    这样想起来原来导致安全错误的原因在于我所使用的资源加载器,资源池的最终工作单位中Loader是每次加载完成一个就把此视觉对象抛出,然后unload以便再次接受新任务。

    片段代码:


    1. _isFree = true;
    2.             var _loadedData : DisplayObject = _loader.content;
    3.             _loader.unload();
    4.             var outEvent : SrcloaderEvent = new SrcloaderEvent(SrcloaderEvent.COMPLETE, {key:_key, type:_type, data:_loadedData});
    5.             this.dispatchEvent(outEvent);
    复制代码

    这样的抛出视觉对象(错误出现在_loader.content这句)被Flashplayer看作为“跨域数据处理” ,违反了只读的许可,是不允许的。


    解决方案


    这部分直接换成Loader来加载显示就行了。

    针对跨域视听媒体对象的显示与读取只能用Loader直接做容器。


    根据我的理解,远程网络域的图像要想进行处理(draw之类),只要服务器上有跨域策略文件标明允许,且loaderContext读取了此策略文件就可以的,但事实上,还是无法操作。

    也许是对安全策略还不够了解,上次的问题虽然解决了却没有深入研究。


    今天群里有个兄台(pickgliss)为解决问题,提出这样的方式绕过Loader加载来的图片无法draw、无法操作BitmapData的问题:

    先用URLLoader以二进制方式加载图片,然后用Loader.loadBytes加载为显示对象。

    我在后面加上draw位图和smoothing来测试,果然可行!


    注意:此方法适用于远程服务器上有跨域安全策略赋予权限,但依然无法操作显示对象。不适用于没有跨域安全策略、或者策略文件不允许的情况。


    如何绕过安全错误例::

    1. package
    2. {
    3.     import flash.display.Bitmap;
    4.     import flash.display.BitmapData;
    5.     import flash.display.DisplayObject;
    6.     import flash.display.Loader;
    7.     import flash.display.Sprite;
    8.     import flash.events.Event;
    9.     import flash.net.URLLoader;
    10.     import flash.net.URLLoaderDataFormat;
    11.     import flash.net.URLRequest;
    12.     import flash.utils.ByteArray;

    13.     public class Test extends Sprite
    14.     {
    15.         public function Test()
    16.         {
    17.             var req : URLRequest = new URLRequest("http://uc.discuz.net/data/avatar/001/29/18/69_avatar_middle.jpg");
    18.             var loader : URLLoader = new URLLoader(req);
    19.             loader.dataFormat = URLLoaderDataFormat.BINARY;
    20.             loader.addEventListener(Event.COMPLETE, __complete);
    21.         }

    22.         private function __complete(e : Event) : void
    23.         {
    24.             var data : ByteArray = e.target.data;
    25.             var loader : Loader = new Loader();
    26.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageDataComplete);
    27.             loader.loadBytes(data);
    28.         }

    29.         private function imageDataComplete(e : Event) : void
    30.         {
    31.             var dio : DisplayObject = e.target.content;
    32.             var bmp : Bitmap = new Bitmap(new BitmapData(dio.width, dio.height),"auto",true);
    33.             bmp.bitmapData.draw(dio);
    34.             bmp.x = 100;
    35.             bmp.y = 100;
    36.             bmp.width = 50;
    37.             bmp.height = 50;
    38.             addChild(bmp);
    39.         }
    40.     }
    41. }
    复制代码


    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2020-4-2 23:46 , Processed in 0.060569 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表