[AS3] LoaderContext 解决跨域加载

原文:http://xiazhihui321.blog.163.com/blog/static/81328893201082515529386/
编程

网络上有关AS3跨域读取swf、图片报错案例有不少种了,面对老是报“checkPolicyFile”错误信息,在服务器上设置了crossdomain.xml文件都没用的,让不少闪友头痛好久,其实咱们一般用LoaderContext类来解决,请看如下代码:
跨域

import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
var aPolce:LoaderContext = new LoaderContext(true);
var loader:Loader = new Loader();
loader.load(new URLRequest(http://xxxxxxxx/xxxx.xxx),aPolce);
//须要在原来的调用基础增长LoaderContext类;
LoaderContext属于flash.system。使用 Loader.load() 方法加载 SWF 文件时,须要作出两个决定:应将所加载的 SWF 文件放置到哪一个安全域中,以及应放置到该安全域中的哪一个应用程序域中。
而使用 Loader.loadBytes() 方法加载 SWF 文件时,只要选择应用程序域,但没必要指定安全域,这是由于 Loader.loadBytes() 始终将其加载的(子swf) SWF 文件放置到执行加载(父:swf)的 SWF 文件的安全域。
若是是加载图像(JPEG、GIF 或 PNG)而不是 SWF 文件,则无需指定安全域或应用程序域,这是由于这些概念只对 SWF 有意义。 此时您只需作出一个决定:是否须要以编程方式访问所加载图像的像素。
LoaderContext含有3个公共属性:
applicationDomain : ApplicationDomain = null
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。

checkPolicyFile : Boolean = false
指定 Flash Player 是否应在开始加载对象自己以前,尝试从所加载对象的服务器上下载跨域策略文件。

securityDomain : SecurityDomain = null
指定用于 Loader.load() 操做的安全域

LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
建立带有指定设置的新 LoaderContext 对象。

applicationDomain属性 

指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。 只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。
checkPolicyFile属性

指定 Flash Player 是否应在开始加载对象自己以前,尝试从所加载对象的服务器上下载跨域策略文件。 此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。
如 果从执行调用的 SWF 文件(父swf)所在的域以外加载图像(JPEG、GIF 或 PNG),而且须要从 ActionScript 访问该图像的内容,请将此标志设置为 true。 访问图像内容的示例包括引用 Loader.content 属性以得到 Bitmap 对象,以及调用 BitmapData.draw() 方法以得到所加载图像像素的副本。 若是在加载时没有指定 checkPolicyFile,就会获得一个 SecurityError 异常,这是由于没有
下载所需的策略文件。
securityDomain属性
指定用于 Loader.load() 操做的安全域。 只应在加载 SWF 文件(图像文件不须要)时使用此属性。只有在被加载的 SWF 文件与执行加载的 SWF 文件可能来自不一样的域(不一样的服务器)时,选择安全域才有意义。 在从其它域加载 SWF 文件时,有两种方法:
1,能够容许将被加载的 SWF 文件放置到其“天然的”安全域中,此安全域与执行加载的 SWF 文件的安全域不一样;这是默认设置。
2, 另外一种选择是经过将 myLoaderContext.securityDomain 设置为与 SecurityDomain.currentDomain 相同,指出但愿将被加载的 SWF 文件放置到执行加载的 SWF 文件所在的安全域中。 这称做导入加载,就安全性而言,它等同于将被加载的 SWF 文件复制到本地服务器,而后从该服务器加载它。 此时,被加载的(子swf)SWF 文件的服务器必须具备一个策略文件,而且该策略文件必须信任执行加载的 SWF 文件的(父)域。另外,只能在传递在LoaderContext.securityDomain设定的安全域。 若是试图传递任何其它的安全域,则会引起 SecurityError 异常。
安全

StackOverflow的答案:
服务器

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var request:URLRequest = new URLRequest("http://en.gravatar.com/avatar/" + gravatar + "?s=35&d=identicon"); 
var loader:Loader = new Loader(); 
loader.load(request, context);
相关文章
相关标签/搜索