您的位置:首页 > 大数据 > 人工智能

Flex快速入门系列之五:crossdomain.xml文件创建以及允许本地跨域访问远程资源

2011-11-27 17:24 961 查看
问题:第四篇中可以发现,你如果在服务器启动状态,直接运行FlexModule,在一个flashplayer播放器的框口中加载这个应用,发现完全不反应,然后如果以debug模式启动这个应用你会发现一个错误:

警告: 忽略 http://fpdownload.adobe.com/pub/swz/crossdomain.xml 中策略文件的'secure' 属性。仅在 HTTPS 和套接字策略文件中允许使用 'secure' 属性。有关详细信息,请参阅http://www.adobe.com/go/strict_policy_files_cn

这就是所谓的跨域安全问题。

解决方案:

在webModule中根目录添加一个crossdomain.xml的配置文件,文件内容如下:



<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE cross-domain-policy SYSTEM

"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>

<site-control permitted-cross-domain-policies="all" />

<allow-access-from domain="*" />

<allow-http-request-headers-from domain="*"headers="*"/>

</cross-domain-policy>

然后再次运行本地的FlexModule可以发现能够访问到远程的对象了,因为我们是从本地访问远程服务,所以在很多地方都设置成了“*”,其实这个是极不推荐的,真正的开发中这个用于安全域的控制的,只能允许你信任的domain访问这个远程的service。

可以访问之后的效果图:



这个crossdomain文件必须放在服务器的根目录下,因为在eclipse中创建的web项目默认的会有一个Context Root,是FlexWebTest,所以对于在eclipse中创建的项目,将Context Root设置为/,然后将此文件放在webContent目录中即可。

下面分享一篇文章详细介绍这个文件各项配置的含义以及配置方法,文章比较老,仅供参考。如果需要了解更多,请参阅adobe官方帮助,官方文档地址:

http://learn.adobe.com/wiki/download/attachments/64389123/CrossDomain_PolicyFile_Specification.pdf?version=1

原文链接:http://apps.hi.baidu.com/share/detail/16114717

采用falsh/flex解决跨域传输数据的关键在于crossdomain.xml 文件

一、概述

如果想要在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的内容(这个是不限制连接,这样不太安全,最好是只把你自己的域名写上去,避免从未经授权的域名的页面来连接):

<?xmlversion="1.0"?>

<!DOCTYPEcross-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可以参考以下这样:

<objectclassid="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">

<paramname="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 地址、一个确切的域或一个通配符域(任何域)。

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

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE cross-domain-policySYSTEM

"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>

<allow-access-fromdomain="*" secure="true" />

</cross-domain-policy>

以上配置允许所有domain访问当前server所暴露的数据(比如webservice,remoteObject)。你可以在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代码

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE cross-domain-policySYSTEM

"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>

<site-controlpermitted-cross-domain-policies="all" />

<allow-access-fromdomain="*" />

<allow-http-request-headers-fromdomain="*" headers="*"/>

</cross-domain-policy>

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

总结:本篇主要介绍了关于跨域访问的相关基础知识,以及如何在flashbuilder和idea中添加跨域访问策略文件,最后分享了一篇文章希望对大家有所帮助。

实例的下载地址:

http://download.csdn.net/detail/zhaoshansanxia/4115333
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: