[转]安全沙箱问题
某个列表flash页面需要支持gravatar的头像
(gravatar的跨域策略文件位于http://www.gravatar.com/avatar/crossdomain.xml)
在加载他们提供的图片头像时我遇到了安全沙箱冲突,错误信息是:
SecurityError: Error #2123: 安全沙箱冲突:Loader.content:http://www.**********/lib.swf 不能访问 http://www.gravatar.com/avatar/3b3be63a4c2a439b013787721dfce802.jpg?s=26&d=monsterid。未被授权访问任何策略文件。
at flash.display::Loader/get content()
at org.mousebomb.srcloader::SwfLoader/onLoadComplete()
一开始我以为是要Crossdomain文件的,我加上了Security.loadPolicyFile(“http://www.gravatar.com/avatar/crossdomain.xml”); 尝试,无效。
其实并不需要的——我只是要发布到网站后跨域读取并显示图片,这在远程网络域中,是直接允许以只读方式访问视听媒体内容的。
后来单独写了一个文件,用Loader测试了一下可以正常读取并显示图片的。
这样想起来原来导致安全错误的原因在于我所使用的资源加载器,资源池的最终工作单位中Loader是每次加载完成一个就把此视觉对象抛出,然后unload以便再次接受新任务。
片段代码:
_isFree = true; var _loadedData : DisplayObject = _loader.content; _loader.unload(); var outEvent : SrcloaderEvent = new SrcloaderEvent(SrcloaderEvent.COMPLETE, {key:_key, type:_type, data:_loadedData}); this.dispatchEvent(outEvent);
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.utils.ByteArray; public class Test extends Sprite { public function Test() { var req : URLRequest = new URLRequest("http://uc.discuz.net/data/avatar/001/29/18/69_avatar_middle.jpg"); var loader : URLLoader = new URLLoader(req); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, __complete); } private function __complete(e : Event) : void { var data : ByteArray = e.target.data; var loader : Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageDataComplete); loader.loadBytes(data); } private function imageDataComplete(e : Event) : void { var dio : DisplayObject = e.target.content; var bmp : Bitmap = new Bitmap(new BitmapData(dio.width, dio.height),"auto",true); bmp.bitmapData.draw(dio); bmp.x = 100; bmp.y = 100; bmp.width = 50; bmp.height = 50; addChild(bmp); } } }