[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);


posted on 2016-01-30 15:46  玄冬  阅读(489)  评论(0编辑  收藏  举报