`

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

    博客分类:
  • Flex
阅读更多

需求: 解决 域名   www.a.comwww.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>

 

对于Flash Player 9之前的版本,这个crossdomain.xml文件大概如下:

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE cross-domain-policy SYSTEM   
  3.      "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >  
  4. <cross-domain-policy>  
  5.     <allow-access-from domain="*" secure="true" />  
  6. </cross-domain-policy>  

以上配置允许所有domain访问当前server所暴露的数据(比如web service)。你可以在domain属性里面指定特殊的规则。secure属性用来设置你所暴露的数据是否走https协议。

但是对于Flash Player 9而言,crossdomain.xml文件内容出现了较大的变化,原因是Flash Player 9的security机制有所改变。所以当我用Flex 3调用cross domain的web service时,还使用上面的crossdomain.xml文件,结果就报错说security error。于是稍微研究了一下,得到如下解决方案,其实就是要改变crossdomain.xml的内容:

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE cross-domain-policy SYSTEM   
  3.      "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >  
  4. <cross-domain-policy>  
  5.     <site-control permitted-cross-domain-policies="all" />  
  6.     <allow-access-from domain="*" />  
  7.     <allow-http-request-headers-from domain="*" headers="*"/>  
  8. </cross-domain-policy>  

以上是Flash Player 9所要求的crossdomain.xml的内容。可以看到多了两个tag。其中site-control是可选的,但是allow-http-request-headers-from对于cross domain的web service确实必须的。如果没有允许header,就会像我之前一样报错。这些配置项的具体含义以及其他可选配置项,可以参考http://www.adobe.com/devnet/flashplayer/articles/flash_player_9_security.pdf

查看本机flash player 版本: http://www.playerversion.com/

分享到:
评论

相关推荐

    webloigc 中设置 flex crossdomain.xml 文件

    `crossdomain.xml`文件是Adobe Flex应用程序用于定义安全策略的一个关键组件,它允许来自不同源的Flash Player或Flex客户端与服务器进行通信。本篇文章将深入探讨如何在WebLogic环境中设置这个文件,以及它对跨域...

    tomcat跨域解决方案

    为了解决Tomcat在IP和端口不同时引发的跨域问题,可以通过编写并配置`crossDomain.xml`文件来实现跨域支持。下面将详细介绍几种常见的配置方式: ##### 1. 允许特定域名访问 在某些情况下,可能只需要允许来自特定...

    Flash flex与JS通信

    当Flex应用试图从不同源加载数据或调用JavaScript时,Flash Player会检查目标服务器的根目录下是否存在crossdomain.xml文件。这个文件定义了哪些域被允许访问,以及允许的访问权限。例如,如果一个Flex应用在一个域...

    flex跨域访问问题

    Flash Player允许通过一个名为`crossdomain.xml`的策略文件来指定哪些源可以访问该服务器。这个文件通常放置在服务器的根目录下。在Flex应用中,你可以通过URLLoader加载策略文件,然后根据返回的内容允许或拒绝...

    crossdomain

    `crossdomain.xml`是服务器端的一个XML文件,它定义了哪些外部源(即其他域名)的Flash或Flex内容可以访问该服务器的资源。这个文件允许跨域资源共享(CORS),使Flex应用能够安全地从其他域获取数据,比如地图服务...

    ArcGIS API for Flex开发WebGIS中的安全沙箱问题

    当使用ArcGIS API for Flex进行跨域请求时,比如获取地图服务、图层或地理编码数据,Flash Player的安全策略会阻止这些操作,除非服务器返回一个合适的Cross-Origin Resource Sharing (CORS)头或者一个crossdomain....

    BlazeDS入门:HTTP Service

    无论是哪种方案,都需要在服务器端 Web 应用的根目录下配置 crossdomain.xml。 使用服务器端代理,可以简单在服务器端定义 DefaultHTTP,打开 proxy-config.xml,如下配置。其中*号表示 ...

    flex 沙箱安全问题

    4. **使用Flex SDK工具**:可以利用Flex SDK中的工具来帮助诊断和解决跨域问题,例如使用`mx.managers.SecurityManager.checkPolicyFile()`函数检查crossdomain.xml文件的有效性。 5. **调试模式**:启用Flash ...

    Flex跨域问题

    Flex跨域问题,对于Flash Player 而言,crossdomain.xml文件内容出现了较大的变化,原因是Flash Player 9的security机制有所改变。所以当我用Flex 3调用cross domain的web service时,还使用上面的crossdomain.xml...

    weblogic跨域flex

    【WebLogic与Flex跨域详解】 在Web开发中,跨域问题经常出现,尤其是在使用Adobe Flex作为前端开发工具,与后台服务器(如Oracle WebLogic)交互时。由于浏览器的同源策略限制,不同源的HTTP请求会被阻止,这在Flex...

    lex for arcgis java tomcat环境不能跨域问题 (安全沙箱问题2048

    在10.1版本中,`crossdomain.xml`文件已经预装,除非你需要自定义,否则可以直接使用。 重启Tomcat服务器后,这个配置应该生效,允许来自任何域的请求访问ArcGIS Server的资源,从而解决“安全沙箱问题2048”。 ...

    Flex 入门 系列文档

    #### 五、跨域文件Crossdomain.xml - **目的**:允许本地Flex应用跨域访问远程资源。 - **创建**:在项目中创建并配置`crossdomain.xml`文件,以允许跨域访问。 - **作用**:提高安全性,确保仅授权的应用可以访问...

    flex socket解决安全沙漏

    在尝试与远程服务器建立Socket连接时,如果不在跨域策略文件(crossdomain.xml)的允许范围内,Flash Player会阻止这种行为,这就是所谓的“安全沙漏问题”。 解决安全沙漏问题通常需要以下步骤: 1. **配置服务器...

    flex 安全沙箱问题备忘

    最后,当在Flex代码中加载crossdomain.xml文件时,需要使用Flash Player提供的Security类加载策略文件: ```actionscript Security.loadPolicyFile("***"); ``` 通过这行代码,***域下的Flash应用会提前加载***域...

    Flex 安全沙箱问题 简单处理方法

    Flex安全沙箱问题是一个在开发基于...总的来说,解决Flex安全沙箱问题需要深入理解沙箱机制、跨域策略和`crossdomain.xml`文件的配置,同时关注服务器端的实现细节,以确保应用程序既能正常运行,又能保障用户的安全。

    flex 博客阅读器 实现代码

    - `useProxy`属性设置为`false`表示不使用代理,因为目标服务器已设置了跨域策略文件`crossdomain.xml`。 5. **数据处理** - 获取到博客数据后,需要对其进行解析并展示给用户。 - 可以通过监听HTTPService组件...

    flex技术总结和几年的经验

    此外,还需要创建并加载跨域策略文件(如`crossdomain.xml`)。这类文件定义了哪些域可以访问当前应用程序中的资源。示例代码如下: ```xml &lt;?xml version="1.0"?&gt; &lt;!-- http://www.mydomain.com/crossdomain.xml -...

    flex安全机制详解

    1. 在服务端编写程序监听843端口,当接收到`&lt;policy-file-request/&gt;`时返回恰当的安全策略文件内容(即`crossdomain.xml`)。 2. 在AS代码中使用`Security.loadPolicyFile()`方法加载安全策略文件,注意使用`...

    ActionScript 3.0安全沙箱及相关问题资料

    《主策略文件crossdomain.xml .txt》和《flash跨域策略文件crossdomain.xml配置详解.txt》是关于如何配置和理解`crossdomain.xml`文件的资料。这个文件可以设置在服务器根目录下,以允许特定域的Flash内容访问该...

    policy_server.rar_FlashMX/Flex源码_Visual_C++_

    通过以上步骤,我们可以使用Visual C++创建一个自定义的安全策略服务器,为Flash MX或Flex客户端提供必要的跨域权限,从而实现安全的服务器-客户端通信。这种服务器不仅可以用于基本的Flash应用,还可以扩展到更复杂...

Global site tag (gtag.js) - Google Analytics