如果想要在Flash里面跨域获取数据,就必须在对方server上配置crossdomain.xml。具体来说,比如你的Flash在domain A下面,而你想要访问domain B暴露的web service,那么domain B的server根目录下必须要有一个crossdomain.xml文件来配置说你有这个权限。这个是Flash Player的安全限制。
注意: Tomcat , 默认情况下是指,ROOT目录下。
对于Flash Player 9之前的版本,这个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>
<allow-access-from domain="*" secure="true" />
</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 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>
以上是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
/
Flex跨域访问 Flash跨域访问解决方法
关于Flex或Flash的跨域访问解决方案,事情的起因是,由我公开的一个webservices开始的,一个朋友在webservice的基础上制作了一个weather查询的,在本机测试ok,一拿到网上,就会出现error(是跨域访问的错误)
后来,终于找到了Flash跨域访问的问题解决方案,如下:
写一个名字为 crossdomain.xml 的XML文件,这个方法是允许任何Flash都可以调用,放到被调用文件的网站根目录下:
代码:
<?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>
只让你允许的网站来调用你的数据~.
代码:
<?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="www.ad0.cn" />
<allow-access-from domain="ad0.cn" />
<allow-access-from domain="*.netfetch.cn" />
</cross-domain-policy>
如果使用XMLSocket要把端口号加上
代码:
<cross-domain-policy>
<allow-access-from domain="*.ad0.cn" to-ports="507,516" />
<allow-access-from domain="*.netfetch.cn" to-ports="516-523" />
<allow-access-from domain="www.ad0.cn" to-ports="507,516-523" />
<allow-access-from domain="202.103.96.68" to-ports="*" />
</cross-domain-policy>
如果安全策略文件放在根目录,文件名字必须为crossdomain.xml,如果不放在根目录,要用System.security.loadPolicyFile(http://www.netfetch.cn/crossdomain.xml )这样的方法加载安全策略文件
/
一、概述
位于www.mzwu.com域中的SWF文件要访问www.163.com的文件时,SWF首先会检查163服务器目录下是否有 crossdomain.xml文件,如果没有,则访问不成功;若crossdomain.xml文件存在,且里边设置了允许www.mzwu.com域 访问,那么通信正常。所以要使Flash可以跨域传输数据,其关键就是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.friendOfFoo.com” />
<allow-access-from domain=”*.foo.com” />
<allow-access-from domain=”105.216.0.40″ />
</cross-domain-policy>
程序代码
<?xml version=”1.0″?>
<cross-domain-policy>
<allow-access-from domain=”*” />
</cross-domain-policy>
第二个例子允许任何域的访问。对于crossdomain.xml文件存放位置,建议将其存放于站点根目录中!
三、示例
1.SWF文件主要ActionScript:
程序代码
on (release) {
var myvar = new LoadVars();
myvar.t = t2.text;
myvar.sendAndLoad(”http://www.163.com/test.asp“,myvar,”post”);
myvar.onLoad = function(re){
if(re){
t1.text = myvar.t;
}else{
t1.text = “fail…”;
}
}
}
2.test.asp代码:
程序代码
<%
Dim t
t = Request.form(”t”)
Response.write(”t=” & t & ” back!”)
%>
文章来自: 闪客居(www.flashas.net) 详文参考:http://203.208.37.104/search?q=cache:iQ9cHSsDfvwJ:www.flashas.net/html/flashas/flashheWEBchengxuyingyong/20080310/2632.html+crossdomain.xml+%E4%BD%8D%E7%BD%AE&hl=zh-CN&ct=clnk&cd=1&gl=cn&st_usg=ALhdy2_GYTnZpz3jo5A_lm2iLdhQBecaLg
///
http://www.crossdomainxml.org/
为还存在疑惑“怎么不起作用呀”的网友补充几句话。
首先,crossdomain.xml是放在服务器端的文件,什么叫做放在服务器端,就是放在你要获取的文件的所在的那台机器的那个域名下面。比如我自己的网站是xxx.me.com,我的网站上有一个swf要获取xxx.you.com上的文件,那么crossdomain.xml要放在xxx.you.com上才可以。crossdomain.xml里面的内容就是
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.me.com" />
</cross-domain-policy>
/
- 2008-12-09 10:05:31
- By alan
- In ActionScript3
1.在4月份的安全更新之前,crossdomain是可以放于任何位置的,只要在代码中指定Security.loadPolicyFile即可,当然,默认的会首先去找站点根目录下(对于tomcat来说就是root了)。
不过在安全更新之后,flash的安全策略发生了一些变化。
其 中一点就是,将策略文件控制类型由原来的ALL改为了MASTER,MASTER策略文件称为主策略文件,在4月份以前,基本上没人注意这个主策略文件, 和我们常用的策略文件有什么区别。主策略文件是置放在站点根目录下,对整个站点访问权限进行约束的策略文件。这个改变使得默认的必须在站点根目录下置放 crossdomain文件,即使你在自己的站点中需要crossdomain,也必须获得主策略文件的许可。
如果这种限制,就要求一定有对服务器控制的能力,至少你要能在根目录放置文件。但是有些时候,没有这样的权限,因此,官方还提供了另一种做法,在后台代码级别允许提供策略文件来取代master策略。
以.net为例
String policyFile = "....(省略)"
Response.AppendHeader("Content-Type", "text/xml; charset=UTF-8");
Response.AppendHeader("X-Permitted-Cross-Domain-Policies", "all");
Response.Write(policyFile);
这种代码级别的做法就是,在loadPolicy时,reposonse中的header里加上("X-Permitted-Cross-Domain-Policies", "all");然后再返回policyFile。
而另一点变化是策略文件的声明形式发生了变化,导致现在网上搜到的很多crossdomain的写法可能在项目里不起作用。
2.能报错的FlashPlayer是调试版的,非调试版的FlashPlayer不会报错。而且IE和FF要分开装的。即使是相同的IE,也可能出现运行的不是同一版本的FlashPlayer。
3.localconnection、shareobject能共享任何类型的数据,但是要记住,他们并不是同一个实例的引用,只是拥有相同值的相同类型的对象。
//
关键字: flex crossdomain
<?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>
这个目录是jboss的根目录,可以通过以下的url访问 crossdomain.xml:
http://domainname:8080/ crossdomain.xml
如果 crossdomain.xml不是放在根目录下,而是在某个webapp下面,在flex中就需要在初始化的时候用
Security.loadPolicyFile("http://domainname:8080/dir/crossdomain.xml");
站点根目录,不是指你的应用的根目录,而是整个域名的根目录。
比如你的站点是 http://www.yoursite.com/yourapp/ 那么,站点根目录是指 http://www.yoursite.com/,因此你需要能够直接在 http://www.yoursite.com/crossdomain.xml这个路径下访问到主策略文件,否则那就不是主策略文件。
英语好的话自己去看,我已经告诉你怎么做了