Flash:彻底理解crossdomain.xml、跨swf调用。

安全域、crossdomain.xml,到处都有各种各种零碎的基础解释,所以这里不再复述这些概念。
本文目的是整理一下各种跨域加载的情况。什么时候会加载crossdomain,什么时候不加载。
 
1、Loader加载图片或者swf,只要不是加载到同个安全域,都不需要拉取crossdomain.xml。获取在LoaderContext指定true,必须拉取。
     但如果后续,要读取图片或者swf里边内容,例如设置图片smoothing或者draw,都需要拉取这个文件
 
     如果文件不存在,会抛出安全沙箱冲突
 
      可以手工security.loadPolicyFile,也可以在loader中设置loader.load(new URLRequest("http://xxxxxxxx/xxxx.jpg"),new LoaderContext(true));
     但必须代码中指定拉取策略文件才会去拉取,flash不会自动拉取。如果到了截图的时候发现没有拉取这个文件,就会报错。
 
2、URLLoader请求的内容,flash会先自动请求crossdomain.xml,如果得到授权后再请求指定内容。
 
3、 对于swf,如果要调用其他域名下的swf的脚本,还需要有Security.allowDomain()
 

如果两个 SWF 文件是同一个域提供,例如,http://mysite.com/movieA.swf 和 
http://mysite.com/movieB.swf,则 movieA.swf 可以检查和修改 movieB.swf 中的变量、对象、属性、方法等,而且 movieB.swf 也可以对 movieA.swf 执行同样的操作。这被称为跨影片脚本编写 或简称跨脚本编写

如果从不同的域提供两个 SWF 文件(例如 http://mysite.com/movieA.swf 和 
http://othersite.com/movieB.swf),则在默认情况下,Flash Player 既不允许 movieA.swf 编写 movieB.swf 的脚本,也不允许 movieB.swf 编写 movieA.swf 的脚本。通过调用 System.security.allowDomain(),一个 SWF 文件可授予其它域中的 SWF 文件编写其脚本的权限。这称为跨域脚本编写。通过调用 System.security.allowDomain("mysite.com"),movieB.swf 授予 movieA.swf 编写 movieB.swf 的脚本的权限。

Flash:彻底理解crossdomain.xml、跨swf调用。

使用  System.security.allowDomain()  建立的跨域权限是不对称的。在上一个示例中,movieA.swf 可以编写 movieB.swf 的脚本,但 movieB.swf 无法编写 movieA.swf 的脚本,这是因为 movieA.swf 未调用  System.security.allowDomain()  来授予 othersite.com 编写 movieA.swf 的脚本的权限。可以通过让两个 SWF 文件都调用 System.security.allowDomain() 来设置对称权限。
 
当然,有crossdomain.xml文件前提下,可以直接用urlloader加载回来,然后在loader.loadBytes,这样就放到同一个程序域内了,没有上述限制了。
 
4、如果swf在本地运行,情况又不一样,设置受信认区域(控制面板flash),本地可以加载任意网络文件都不会出错。因为flash会略过所有crossdomain文件

你可能感兴趣的:(crossdomain)