MichelleWang 发表于 2013-1-29 22:09:18

(转发)使用crossdomain.xml让Flash/Flex可以跨域传输数据

<span style="">
<div style="font-family: Arial; font-size: 12px; line-height: normal;">需求: 解决 域名   www.a.com与www.b.com 之间的通讯问题
采用falsh/flex解决跨域传输数据的关键在于 crossdomain.xml 文件

一、概述
玩过Flex或者Flash的同学都知道,如果想要在Flash里面跨域获取数据,就必须在对方server上配置crossdomain.xml。具体来说,比如你的Flash在domain A下面,而你想要访问domain B暴露的web service,那么domain B的server根目录下必须要有一个crossdomain.xml文件来配置说你有这个权限。这个是Flash Player的安全限制。

二、测试
我们提供的testpage.htm测试页面放在www.a.com这个机器上。然后在页面中的 SetWebIMNetwork() 这个函数写为 SetWebIMNetwork("www.b.com", 5293) ,这个页面就可以连接到www.b.com所在的服务器。

以下是crossdomain.xml的内容(这个是不限制连接,这样不太安全,最好是只把你自己的域名写上去,避免从未经授权的域名的页面来连接):

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd";>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

如果你需要具体控制,可以使用具体域名和端口,比如:

<cross-domain-policy>
<allow-access-from domain="*" to-ports="5293" />
<allow-access-from domain="*.foo.com" to-ports="507,516" />
<allow-access-from domain="192.168.0.199" to-ports="2000-6523" />
<allow-access-from domain="www.foo.com" to-ports="507,516-523" />
<allow-access-from domain="www.bar.com" to-ports="*" />
</cross-domain-policy>


另外,A机器上的,testpage.htm中加载B机器上的Flash可以参考以下这样:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="83" height="23" id="CommP2" align="middle">
     <param name="allowScriptAccess" value="always" />
     <param name="movie" value="http://www.b.com/CommP2.swf"; />
     <param name="quality" value="high" />
     <param name="bgcolor" value="#ffffff" />
     <embed src="http://www.b.com/CommP2.swf"; quality="high" bgcolor="#ffffff" width="0" height="0" name="external2" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"; />
   </object>

A页面调用 flash 的 SetWebIMNetwork,设置要连接到B网络,在连接B时,flash会先访问要连接的服务器上有无crossdomain.xml策略文件,并检查自己所在的域名是否被允许连接,如果允许,就可以连接上,否则返回连接失败。

Js调用Flash的跨域问题,由于我们提供的Flash插件和Js进行交互,如果js和Flash在不同的域,js调用flash内的方法,就会出现错误。所以在加载Flash要使用 <param name="allowScriptAccess" value="always" />

有这样的跨域机制,您就不用担心其它网站可以连接到您的 WebIM 服务器,您只要在 crossdomain.xml 里写上允许连接的域名就可以了。而且是精确品配,即使是同一个域名的不同二级域名,未在   crossdomain.xml 中授权,也是不能连接您的服务器的。

所以, crossdomain.xml 里,最好不要使用通配符 * ,请限定好您所允许的域名
三、crossdomain.xml文件格式
crossdomain.xml的格式非常简单,其根节点为<cross-domain-policy> ,其下包含一个或多个<allow-access-from>节点,<allow-access-from>有一个属性domain,其值为允许访问的域,可以是确切的 IP 地址、一个确切的域或一个通配符域(任何域)。下边是两个例子:
程序代码
<?xml version="1.0"?>
<cross-domain-policy>
   <allow-access-from domain="www.163.com" />
   ......//可自行添加更多地址.
</cross-domain-policy>
 
页: [1]
查看完整版本: (转发)使用crossdomain.xml让Flash/Flex可以跨域传输数据