安全沙箱,跨域问题解决需要按规则来
1、首先说下Loader加载与URLLoader加载的区别
⊙ Loader:只能加载SWF和图像。
⊙ URLLoader:除了能加载swf和图像,还可以加载二进制文件(txt , xml , swc , ........)。
Loader:
当调用Loader的load(req: URLRequest , context: LoaderContext=null)方法时可以指定context,也可不指定。
LoaderContext类包括3个属性,用于指定加载文件时的决策。
1.checkPolicFile(仅当加载图像文件才设置): 是否从被加载文件的服务器上检查URL策略文件,如果被加载方所在域与加载方所在域不同,需要指定此属性为true。 如果策略文件允许加载方加载,那么可以随意使用图像数据了
2.securityDomain(仅当加载swf文件才设置): 当被加载文件swf与加载文件swf所在域不同需要设置。
securityDomain仅有2个值(null / SecurityDomain.currentDomain),为第二个值时,意思是说,将被加载的swf"复制"到加载方swf所在域里,之后就可以随意使用被加载进来的swf里的类,方法,属性等(注意:前提是被加载方swf必须授予加载方权限才行,授予权限有2中方式,crossdomian.xml与Security.allowDomain)。
3.applicationDomain(仅当加载as3编写的swf文件才使用此属性):当加载文件时,可将加载数据放置在特定应用程序域中,有4种程序域(与加载方合并为一个程序域,与加载方并行一个程序域,成为加载方的子域),住:应用程序域是安全域的子单位。
//如下例子:
var loader:Loader = new Loader();
var urlRequest = new URLRequest();
urlRequest.url = currentLoadingData.url;//你的资源地址
/***************/下面这里是跨域的时候需要添加的内容
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); //这个是关键
if(context.checkPolicyFile==true)
{//跨域的时候用到当被加载文件swf与加载文件swf所在域不同需要设置,(从被加载文件的服务器上检查URL策略文件时)
context.securityDomain = SecurityDomain.currentDomain;//意思是,把这个被加载SWF的域等同于安全域,被读取文件所在域根目录需要部署crossdomain.XML 策略文件
}
/***************/
loader.load(urlRequest,context);
URLLoader:
当加载的数据时,fp会在被加载方所在服务器检查跨域策略文件的存在,如存在并且该策略文件授予加载方swf文件所在域访问权,则可加载数据。
加载方式 Security.loadPolicyFile(“http://myDomain/crossdomain.xml”);//策略文件放在被加载者服务器根目录(在提供数据的站点放入一个crossdomain.xml文件)