RIA跨域安全性浅谈(二)
上篇写的那个加载一大堆http图片例子我自己测试没问题后发给了客户后,我的电话很快就响起了,用户说程序运行出错,奇怪我这边怎么好好的,通过交流发现用户是将上篇的小例子的swf程序部署在服务器上,通过http的方式运行这个swf,而不是像我直接在FB里面调试运行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SecurityError: Error #2122: 安全沙箱冲突:Loader.content:http://localhost:3000/HelloTWaver/flex_bin/demo.swf 不能访问 http://cache.mars.sina.com.cn/photoauto_d/model_index/0.jpg?1270088020。需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志。at flash.display::Loader/get content()
这个就是典型的RIA跨域访问限制问题,RIA我指的包含Ajax、Flex、Silverlight甚至是未签名的Applet/JavaFx都会有这种限制,毕竟Flash作为RIA的先驱,所以后来的这些竞争兄弟也不得不兼容Adobe的策略规则,简单说正常情况下RIA程序只允许访问本域名下的资源信息,跨域访问它人的资源信息时就需要看对方域名服务器定义的crossdomain.xml的脸色了,微软虽然兼容crossdomain.xml不过他又搞了一套clientaccesspolicy.xml。
以下几个主要厂家的官方文档大家可以参考一下
http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html
https://jdk6.dev.java.net/plugin2/#CROSSDOMAINXML
http://msdn.microsoft.com/en-us/library/cc838250(VS.95).aspx
对于Ajax方面还有很多trickery的解决技巧以下几个可以参考一下
http://easyxdm.net/
http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/
http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html
http://www.ajax-cross-domain.com/
如何没时间细看如何配置成局部允许,根据协议允许等等复杂的配置,你可以用下面两个最让人happy的配置作为开发测试,我挺讨厌这种配置的东西,想想jnlp的协议可以定义的非常变态,但太复杂的规则往往变得没有规则,估计世上95%以上的jnlp都是
crossdomain.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0"?>
2 <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
3 <cross-domain-policy>
4 <allow-http-request-headers-from domain="*" headers="*"/>
5 </cross-domain-policy>
clientaccesspolicy.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="utf-8"?>
2 <access-policy>
3 <cross-domain-access>
4 <policy>
5 <allow-from http-request-headers="*">
6 <domain uri="*"/>
7 </allow-from>
8 <grant-to>
9 <resource path="/" include-subpaths="true"/>
10 </grant-to>
11 </policy>
12 </cross-domain-access>
13 </access-policy>
问题似乎都清晰了,不过还有一点疑问,为什么我用FlashBuilder跑的程序能正常运行没有受到这该死的权限限制呢?难道我生成的swf人品比较高,我试着将bin-debug目录下的swf文件移到其他目录一跑也不行了,难道还非得放在FB工程的目录里,查了一下发现还有以下道道,我就不废话了大家看看图就明白了。
http://kb2.adobe.com/cps/518/cpsid_51814.html
Each time you create or import a Flash Builder project whose bin-debug directory is outside of the normal Flash Builder workspace location, Flash Builder adds that bin-debug directory to the list of trusted directories;