安全沙箱冲突:Loader.content:XX 不能访问 XX 可以通过调用 Security.allowDomain 来避免此冲突。

参考资料:http://tieba.baidu.com/p/882855105

感谢:Z0287yyy

 

感谢分享精神。

 

具体解决方案:
在loader去load的时候,带上这个参数

var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain();     // 这个是关键
context.checkPolicyFile =  true;
context.securityDomain = SecurityDomain.currentDomain;

Loader.load(new URLRequest(url), context);

 

原文如下:


 

如题,最近遇到这么一个难题:
SecurityError: Error #2121: 安全沙箱冲突:LoaderInfo.content:XXX1不能访问XXX2.
可以通过调用 Security.allowDomain 来避免此冲突。

 

 

这个问题,其实很搞笑,因为跟Security.allowDomain没有任何关系。
(也可能有,请高手留言斧正。)

因为我在主文件XXX1和子文件XXX2里面有写了
Security.allowDomain("*");
Security.allowInsecureDomain("*");
而且crossdomain.xml文件都在。

 

 

具体解决方案:
在loader去load的时候,带上这个参数

var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain();    //这个是关键
context.checkPolicyFile = true;
context.securityDomain = SecurityDomain.currentDomain;

Loader.load(new URLRequest(url), context);

 

context.applicationDomain = new ApplicationDomain();
的时候会指定新的域,与原有的flex程序域不同,所以不会出问题了。


ApplicationDomain 的说明:


加载到子域(模块)
类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。

加载到同域(运行时共享库)

类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同,和当前域同名的定义也会被忽略。

加载到新域(独立运行的程序或模块)
swf载入指定域之前,先要检查该域及其父域中是否存在同名类,重复定义一概忽略。如果加载别人写的程序,或者使用旧版本的主程序加载新版本的模块,为避免类名冲突就要加载到新域独立运行以使用自己的类。

 
当然flash加载flex,或者flex加载flash就没有这个问题。
因为flash和flex的空间可能就不同。

只有flex加载flex会出现这个问题。。稀烂。。。

另外,
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
也是不行的。。。他意味着加载到同一个有域,,有冲突,(程序可能会卡在这个地方)

 

 

你可能感兴趣的:(Security)