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
警告: 忽略 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
相关文章推荐
- Flex快速入门系列之四:idea创建项目以及远程对象访问
- Flex快速入门系列之二:FlashBuilder创建项目以及远程JAVA对象访问(包括spring)篇
- flash 跨域访问的控制文件crossdomain.xml
- 跨域文件crossdomain.xml在weblogic上的部署和http://10.165.26.151:7001/xx.xml可以访问一个文件
- flash跨域策略文件crossdomain.xml配置详解
- Flex快速入门系列之三:Parsley框架简单使用(IOC以及message机制)
- web.xml文件中缺省映射路径"/"问题以及客户端访问web资源的匹配规则
- 关于跨域策略文件crossdomain.xml文件
- 跨域策略文件--crossdomain.xml
- 跨域策略文件crossdomain.xml的配置方法
- [ Silverlight]crossdomain.xml 解决 Silverlight 跨域访问的问题
- flash跨域策略文件crossdomain.xml配置详解
- git快速入门之一:创建本地仓库并同步到远程
- 关于跨域策略文件crossdomain.xml文件
- 关于跨域策略文件crossdomain.xml文件--配置实例
- 使用crossdomain.xml让Flash/Flex可以跨域传输数据
- crossdomain.xml SWF文件要访问
- 关于flex的crossdomain.xml文件存放目录
- [导入]Flash跨域安全策略文件格式:Crossdomain.xml
- 关于跨域策略文件crossdomain.xml文件--配置实例