关于p3p 简洁策略,以及浏览器的支持情况.
从技术角度看,使 Web站点支持 P3P 是一个很容易的过程。但是,它要求网络运营商在审视数据处理方式时比以前更加仔细,并要求他们协调域内各个主机上的策略和处理方式。以下是如何使站点支持P3P 技术的具体步骤。
1. 创建一个隐私策略。
2. 分析 cookie 的使用情况以及您的站点上的第三方内容。
3. 确定要对整个站点应用一个P3P策略还是对站点的不同部分应用不同的P3P 策略。
4. 为站点创建一个或几个 P3P 策略。
5. 为站点创建一个策略引用文件。
6. 为 P3P 配置服务器。
7. 测试站点,以确定它确实支持 P3P。
● 如何与拥有该站点的公司、组织或个人进行联系的信息。
● 用户是否可以查找该站点的数据库中保存了自己的哪些个人信息。
● 如何解决与站点之间有关隐私的纠纷(如客户服务台、隐私封印以及与隐私相关的法律等)。
● 所收集数据的种类。
● 所收集数据的使用方式,以及用户是否能选择接受或拒绝这些用途。
● 信息是否会被共享以及何时被共享,用户是否有选择的权力。
● 对所收集的用户信息进行定期清除的策略。
有很多软件工具可以帮助Web站点开发人员开发支持P3P的站点。
简洁策略对应的 HTTP Response Header :
compact-policy-field = `CP="` compact-policy `"`
compact-policy = compact-token *(" " compact-token)
compact-token = compact-access |
compact-access = "NOI" | "ALL" | " CAO" | "IDC" | "OTI" | "NON"
compact-disputes = "DSP"
compact-remedies = "COR" | "MON" | "LAW"
compact-non-identifiable = "NID"
compact-purpose = "CUR" | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] |
" PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] |
creq = "a" | "i" | "o"
compact-recipient = " OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] |
"PUB" [creq] | "OTR" [creq]
compact-retention = "NOR" | "STP" | "LEG" | "BUS" | "IND"
compact-category = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" |
"NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" |
compact-test = "TST"
我们常用的简洁策略的 P3P头为 - P3P : CP=CAO PSA OUR (其实, CP=. 就可以了.或者其他任何值都是可以的)分别对应了 :
compact-access(访问) : CAO - contact-and-other
compact-purpose(目的) : PSA - pseudo-analysis .这个就不放解释了,字面意思很明显, 目的就是做身份验证、分析
compact-recipient(受体) : OUR - ours
ps : 其他项就不列举,基于浏览器中只有IE支持.(chrome 部分支持).这一事实.深入研究没有必要. 如果你有兴趣,可以去相关链接查看文档.
已测知的问题:
if(Safari4或Safari5){var ifm = document.createElement('iframe');ifm.name ="postforcookie";ifm.src="about:blank";document.body.appendChild(ifm);var form = document.createElement('form');form.target = 'postforcookie';form.action = '//www.php.com/test.php';document.body.appendChild(form);Cookie.setCookie = function () {form.submit();}}
默认不禁止第三方cookie的浏览器测试:
浏览器 | 默认允许第三方Cookie | 是否支持P3P | 禁止第三方Cookie后,配置P3P简明策略头的效果 | 补充 |
IE6 | 否 | 是 | HTTP可读写Cookie (第二次.直接Cache.也不行.除非第一次非Cache并读到p3p头.后面我会提到解决方案.) | 避免JS的写操作 |
IE7-IE9
| 否 | 是 | HTTP、JS,可随意读写. | - |
FireFox | 是 | 否 | HTTP、JS都不可读写 | - |
Chrome | 是 | 部分支持,趋势-否 | 趋势为HTTP、JS可读不可写. | - |
Safari | 否 | 否 | HTTP、JS可读不可写 | 借助Post提交表单,实现写操作. |
Opera | 是 |
否
| JS可读写 HTTP可读不可写. | - |
建议:
最后:
如果你非要用在ie6下,用js写cookie. 那么有一个很悲剧的做法.. 服务器端给资源配置可缓存.(包括反向代理和客户端.) 然后想办法在IE6的时候刷新一次页面.这样就ok了. 刷新时一定要用 location.reload(false) 即先忽略客户端缓存.尝试304服务器端校验客户端缓存可靠性..这样做的好处是.即保证了 cookie的写入性. 又保证,如果页面是静态资源.则反向代理的可用性.. 否则还是直接用动态资源,http方式去写好了. 需要注意的是.除了页面刷新.譬如其他方式加载页面资源.试图通过预读其p3p简介策略头.是无效的. 比如 用 script type="text/c" 方式去预读一次. 如果你有这个想法。还是早早放弃的好.
网上看了别人介绍的一片文章,说使用P3P可以完成跨域COOKIE操作,感觉很COOL,不过没有提供源代码,我胡乱写了一下,大家看看。
实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能。
我只写一个大概,为了测试的方便,先编辑hosts文件,加入测试域名(C:\WINDOWS\system32\drivers\etc\hosts)
127.0.0.1 www.a.com
127.0.0.1 www.b.com
首先:创建 a_setcookie.php 文件,内容如下:
<?php
//header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test",$_GET['id'],time()+3600,"/", ".a.com");
?>
然后:创建 a_getcookie.php 文件,内容如下:
<?php
var_dump($_COOKIE);
?>
最后:创建 b_setcookie.php 文件,内容如下:
<script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>
----------------------------
三个文件创建完毕后,我们通过浏览器依次访问:
http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php
我们会发现,在访问b.com域的时候,我们并没有在a.com域设置上cookie值。
然后我们修改一下a_setcookie.php文件,去掉注释符号,a_setcookie.php即为:
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test",$_GET['id'],time()+3600,"/", ".a.com");
?>
再次通过浏览器依次访问:
http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php
这次,你会发现在访问b.com域的时候,我们设置了a.com域的cookie值。
末了补充一句,似乎只有IE对跨域访问COOKIE限制比较严格,上述代码在FIREFOX下测试,即使不发送P3P头信息,也能成功。
==========================================通过Fiddler可以方便的知道上面P3P代码的含义
P3P Header is present:
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Compact Policy token is present. A trailing 'o' means opt-out, a trailing 'i' means opt-in.
CURa
Information is used to complete the activity for which it was provided.
ADMa
Information may be used for the technical support of the Web site and its computer system.
DEVa
Information may be used to enhance, evaluate, or otherwise review the site, service, product, or market.
PSAo
Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals for purpose of research, analysis and reporting, but it will not be used to attempt to identify specific individuals.
PSDo
Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals to make a decision that directly affects that individual, but it will not be used to attempt to identify specific individuals.
OUR
We share information with ourselves and/or entities acting as our agents or entities for whom we are acting as an agent.
BUS
Info is retained under a service provider's stated business practices. Sites MUST have a retention policy that establishes a destruction time table. The retention policy MUST be included in or linked from the site's human-readable privacy policy.
UNI
Non-financial identifiers, excluding government-issued identifiers, issued for purposes of consistently identifying or recognizing the individual. These include identifiers issued by a Web site or service.
PUR
Information actively generated by the purchase of a product or service, including information about the method of payment.
INT
Data actively generated from or reflecting explicit interactions with a service provider through its site -- such as queries to a search engine, or logs of account activity.
DEM
Data about an individual's characteristics -- such as gender, age, and income.
STA
Mechanisms for maintaining a stateful session with a user or automatically recognizing users who have visited a particular site or accessed particular content previously -- such as HTTP cookies.
PRE
Data about an individual's likes and dislikes -- such as favorite color or musical tastes.
COM
Information about the computer system that the individual is using to access the network -- such as the IP number, domain name, browser type or operating system.
NAV
Data passively generated by browsing the Web site -- such as which pages are visited, and how long users stay on each page.
OTC
Other types of data not captured by the above definitions.
NOI
Web Site does not collected identified data.
DSP
The privacy policy contains DISPUTES elements.
COR
Errors or wrongful actions arising in connection with the privacy policy will be remedied by the service.
=========================================================================================================
网上现在有很多关于跨域设置cookie的文章,但大多数都是php的文章,网上仍然有很多关于jsp p3p的设置,但是必须要将浏览器的隐私设置成低才可以跨域设置cookie.查了n多文章发现他们都搞错了!(真郁闷死了,自己没有解决干什么要贴在自己的博客中?!害得我好惨!^@^)
下面是一个例子:
首先在hosts文件中设置(其中的192.168.73.1为您本机的ip,我写成127.0.0.1不行,可能是公司的域的设置问题)
192.168.73.1 www.a.com
192.168.73.1 www.b.com
[1]编写文件
b_setcookie.jsp
- <%@ page contentType="text/html; charset=utf-8" %>
- <%
- response.addHeader("Cache-Control", "no-cache");
- response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");
- String ssocookie="www.sso12345678910.com";
- %>
- <script src="http://www.a.com/mp/test/a_setcookie.jsp?id=<%=ssocookie%>">
- </script>
<%@ page contentType="text/html; charset=utf-8" %>
<%
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");
String ssocookie="www.sso12345678910.com";
%>
<script src="http://www.a.com/mp/test/a_setcookie.jsp?id=<%=ssocookie%>">
</script>
a_setcookie.jsp
- <%
- response.setHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
- String domainId=request.getParameter("id");
- Cookie _cookie=new Cookie("test",domainId);
- _cookie.setMaxAge(30*60*100);
- _cookie.setPath("/");
- response.addCookie(_cookie);
- %>
<%
response.setHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
String domainId=request.getParameter("id");
Cookie _cookie=new Cookie("test",domainId);
_cookie.setMaxAge(30*60*100);
_cookie.setPath("/");
response.addCookie(_cookie);
%>
a_getcookie.jsp
- <%@ page contentType="text/html; charset=utf-8" %>
- <%
- Cookie cookies[]=request.getCookies(); // 将适用目录下所有Cookie读入并存入cookies数组中
- Cookie sCookie=null;
- String sname=null;
- String name=null;
- if(cookies==null) // 如果没有任何cookie
- out.print("none any cookie");
- else
- {
- out.print(cookies.length + "<br>");
- for(int i=0;i<cookies.length; i++) // 循环列出所有可用的Cookie
- {
- sCookie=cookies[i];
- sname=sCookie.getName();
- name = sCookie.getValue();
- out.println("comment==>>>"+sCookie.getComment()+"\n");
- out.println("getDomain==>>>"+sCookie.getDomain()+"\n");
- out.println("getSecure==>>"+sCookie.getSecure()+"\n");
- out.println("getVersion==>>"+sCookie.getVersion()+"\n");
- out.println("cookiename==>>"+sname + "->" + "cookievalue==>>>"+name + "<br>");
- }
- }
- %>
<%@ page contentType="text/html; charset=utf-8" %>
<%
Cookie cookies[]=request.getCookies(); // 将适用目录下所有Cookie读入并存入cookies数组中
Cookie sCookie=null;
String sname=null;
String name=null;
if(cookies==null) // 如果没有任何cookie
out.print("none any cookie");
else
{
out.print(cookies.length + "<br>");
for(int i=0;i<cookies.length; i++) // 循环列出所有可用的Cookie
{
sCookie=cookies[i];
sname=sCookie.getName();
name = sCookie.getValue();
out.println("comment==>>>"+sCookie.getComment()+"\n");
out.println("getDomain==>>>"+sCookie.getDomain()+"\n");
out.println("getSecure==>>"+sCookie.getSecure()+"\n");
out.println("getVersion==>>"+sCookie.getVersion()+"\n");
out.println("cookiename==>>"+sname + "->" + "cookievalue==>>>"+name + "<br>");
}
}
%>
测试时依次请求
http://www.b.com/mp/test/b_setcookie.jsp
http://www.a.com/mp/test/a_getcookie.jsp
便可看到通过跨域设置的cookie的值!
===================================================================================================
一、
在IE中,页面通过FRAME,JS,IMG等引用其他域名页面的时候,P3P协议会阻止引用也的cookie。
举例说明:
在B.COM中,
<iframe width=300 height=300 src="”http://www.a.com/test.php”" mce_src="”http://www.a.com/test.php”" >
<iframe width=300 height=300 src="”http://www.a.com/test.php”" mce_src="”http://www.a.com/test.php”" >
此时,test.php中产生的cookie将会被阻止,而不会记录下来
这种情况下,我们引入P3P header,情况就改变喽~
P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功
在www.a.com/test.php中这样写:
header(’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);
header(’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);
cookie就可以跨域了~
这种方法在单点登陆中被别广泛应用~
二、
目前在整合几个应用时,遇到了iframe无法获取cookie(session)的问题,经过google,终于把这个问题解决了,现在记录一下。
我的需求是这样的。
有一个应用是用.net开发的,主要是控制用户登录,用户访问权限的,部署在上海机房。现在就叫A应用吧
还有一个应用是用java开发,主要是具体业务的操作。部署在北京机房,这里叫B应用吧
由于已经有一个用户管理和权限的应用程序,所以java 开发的这个B应用就没有开发用户权限的功能,想直接使用.net的A程序。
用户访问的流程是这样的:
1.用户先在A处登录,A设自己的cookie,在A的菜单里有去B应用的链接
2.当用户点去B应用的链接时,A在链接上自动加上这个用户的token,传给B系统
3.当B系统接收到请求后,把这个用户的token信息设成自己系统的cookie,(B系统里有表单post操作,如果不设 cookie,session,那么每个请求不管GET还是POST都要明确带着该用户的token信息,对于系统的改造量比较大,另外以后换权限验证方法改动也比较大。)
4.用户在B系统里的每次操作都没有明码带用户的token,所以每次都要去cookie得到token信息,然后发送一个http请求去A,让A系统验证这个用户是否有权限访问。
5.如果A系统的接口返回可以访问的状态报告,那么B继续执行;如果A系统指示没有权限访问,那么B系统提示访问受控警告信息。
一切开发都完成,到整合上线时,发现这个流程走不通,百思不得其解,想了半天也不知道 怎么回事,google了半天,才发现原来是ie在捣鬼,IE不允许跨域访问cookie(好象firefox没问题,ie自6.0以后改用w3c组织的 P3P协议了),再看看我的应用,在第二步设的cookie,在第三步以后所有B应用的访问请求,ie都把B应用的cookie blocked掉了(因为用户的访问是从A应用发起,从A应用访问B应用的东东,算跨域访问,IE认为有安全问题)。。。。(IE状态栏有一个红眼睛的 button,点开可以看到哪些cookie给blocked掉了)
知道原因就好办了,再google知道可以用P3P header可以解决问题!
下面是java的解决办法之一,也是我的解决办法,不过个方法不太好:
直接往响应里加一个P3P的header
response().addHeader("P3P", "CP=/"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA/"");
其中CP=“XXX XXXX”这些是有具体含义的:
CP就是compact policies的意思,
另外header的值也可以是policyref="http://myhost/P3P/PolicyReferences.xml",就是指定一个策略文件。
具体请看这里.
下面是摘抄的一段Compact Policies的具体取值范围和设值含义。
Compact Policies
Compact policies are essentially summaries of P3P policies. They can be used by user agents to quickly get approximate information about P3P policies, therefore improving performance.
For an in-depth explanation of compact policies, we refer to theP3P1.0[4] specification. Here, we limit to stating the syntax:
compact-policy-field = `CP="` compact-policy `"` compact-policy = compact-token *(" " compact-token) compact-token = compact-access | compact-disputes | compact-remedies | compact-non-identifiable | compact-purpose | compact-recipient | compact-retention | compact-categories | compact-test compact-access = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON" compact-disputes = "DSP" compact-remedies = "COR" | "MON" | "LAW" compact-non-identifiable = "NID" compact-purpose = "CUR" | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] | "PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] | "CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq] creq = "a" | "i" | "o" compact-recipient = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] | "PUB" [creq] | "OTR" [creq] compact-retention = "NOR" | "STP" | "LEG" | "BUS" | "IND" compact-category = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" | "NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" | "HEA" | "PRE" | "LOC" | "GOV" | "OTC" compact-test = "TST" 另外这里还有一个P3P的验证工具:http://www.w3.org/P3P/validator.html,可以验证一下自己设置的P3P是否正确。 这里还有一个老外写的不错的blog,也可以参考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2
三、
首先介绍第一方Cookie和第三方cookie:
第一方Cookie是来自当前正在查看的网站,或者发送到当前正在查看的网站。
第三方Cookie是来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者iframe的别的网站的url,这些第三方的网站可能使用的Cookie。
然后是P3P,Platform for Privacy Preferences:
P3P由万维网协会研制,它为Web用户提供了对自己公开信息的更多的控制。
支持P3P的Web站点可以为浏览者声明他们的隐私策略。
支持P3P的浏览器 则可以将Web站点的策略与用户的隐私偏好进行对比,并为用户提出不匹配的警告。
因此,用户可以被通知有关Web隐私的处理方式。
更详细的说明请看http://www.w3.org/P3P/的介绍
===================================================================================================
理论很简单,而且模式也和大多请求返回状态的SSO差不多.但是有几个地方是要注意一下的.
1.页面里的COOKIE不能是浏览器进程的COOKIE(包括验证票和不设置超时时间的COOKIE),否则跨域会取不到.这点做跨域COOKIE的人比较少提到.不过实际上留意下几家大学做的方案,有细微的提到他们的验证模块里的COOKIE是有设置超时时间的.
2.当利用IFRAME时,记得要在相应的动态页的页头添加一下P3P的信息,否则IE会自觉的把IFRAME框里的COOKIE给阻止掉,产生问题.本身不保存自然就取不到了.这个其实是FRAMESET和COOKIE的问题,用FRAME或者IFRAME都会遇到.
3.测试时输出TRACE,会减少很多测试的工作量.
只需要设置 P3P HTTP Header,在隐含 iframe 里面跨域设置 cookie 就可以成功。他们所用的内容是:
P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'
ASP直接在头部加了头部申明,测试有效。
<%Response.AddHeader "P3P", "CP=CAO PSA OUR"%>
php的话,我没去试,应该是如下写法:
header('P3P: CP=CAO PSA OUR');
ASP.NET的话
通过在代码上加Response.AddHeader("P3P", "CP=CAO PSA OUR")或者在Window服务中将ASP.NET State Service 启动。
JSP:
response.setHeader("P3P","CP=CAO PSA OUR")
http://www.xiaonei.com/crossdomain.xml
<!– http://www.xiaonei.com/ –>?
<cross-domain-policy>
<allow-access-from domain=”*.xiaonei.com”/>
<allow-access-from domain=”xiaonei.com”/>
</cross-domain-policy>
这是很标准的做法,我就让我自己的域以及我的子域来获取数据。
淘宝的:
http://www.taobao.com/crossdomain.xml
<cross-domain-policy><allow-access-from domain=”*.taobao.com”/>
<allow-access-from domain=”*.taobao.net”/>
<allow-access-from domain=”*.taobaocdn.com”/>
<allow-access-from domain=”*.allyes.com”/>
</cross-domain-policy>
红色的一行是淘宝的CDN所在的域,所谓内容分发网络。
绿色的一行是淘宝的广告商了,http://www.allyes.com/好耶广告网络,只是不清楚是不是仍然再卖淘宝的广告?
多看几个大网站的crossdomain.xml,也可以知道可能是什么网络广告商给它们在打广告。
比如彭博:http://www.bloomberg.com/crossdomain.xml
<cross-domain-policy><allow-access-from domain=”localhost”/>
<allow-access-from domain=”10.16.136.107″/>
<allow-access-from domain=”*.bloomberg.com”/>
<allow-access-from domain=”*.pointroll.com”/>
<allow-access-from domain=”*.pointroll.net”/>
</cross-domain-policy>
红色的就太不专业了,把内部IP都给暴露了。。。。。。
绿色的是彭博的广告商:PointRoll
路透的:
http://www.reuters.com/crossdomain.xml
<cross-domain-policy><allow-access-from domain=”*.reuters.com” secure=”false”/>
<allow-access-from domain=”ad.doubleclick.net” secure=”false”/>
<allow-access-from domain=”ad.uk.doubleclick.net” secure=”false”/>
<allow-access-from domain=”m.2mdn.net” secure=”false”/>
<allow-access-from domain=”m2.2mdn.net” secure=”false”/>
</cross-domain-policy>
广告给了doubleclick来做(绿色)
2mdn.net看不懂是干嘛的,大概是个cdn吧。
滥情的facebook:
http://www.facebook.com/crossdomain.xml
<?xml version=”1.0″?><!DOCTYPE cross-domain-policy SYSTEM “http://www.adobe.com/xml/dtds/cross-domain-policy.dtd”>
<cross-domain-policy>
<site-control permitted-cross-domain-policies=”master-only” />
<allow-access-from domain=”s-static.facebook.com” />
<allow-access-from domain=”static.facebook.com” />
<allow-access-from domain=”static.api.ak.facebook.com” />
<allow-access-from domain=”*.static.ak.facebook.com” />
<allow-access-from domain=”s-static.thefacebook.com” />
<allow-access-from domain=”static.thefacebook.com” />
<allow-access-from domain=”static.api.ak.thefacebook.com” />
<allow-access-from domain=”*.static.ak.thefacebook.com” />
<allow-access-from domain=”*.static.ak.fbcdn.com” />
<allow-access-from domain=”external.ak.fbcdn.com” />
<allow-access-from domain=”*.static.ak.fbcdn.net” />
<allow-access-from domain=”external.ak.fbcdn.net” />
<allow-access-from domain=”www.facebook.com” />
<allow-access-from domain=”www.new.facebook.com” />
<allow-access-from domain=”register.facebook.com” />
<allow-access-from domain=”login.facebook.com” />
<allow-access-from domain=”ssl.facebook.com” />
<allow-access-from domain=”secure.facebook.com” />
</cross-domain-policy>
这么多!有子域,有CDN,有thefacebook(facebook的旧域名吧?)
还是google的专业:
<?xml version=”1.0″?><!DOCTYPE cross-domain-policy SYSTEM “http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd”>
<cross-domain-policy>
<site-control permitted-cross-domain-policies=”by-content-type” />
</cross-domain-policy>
蓝色行的意思是,要符合要求的文件你才能取,不管你是哪来的flash数据请求。符合要求的文档必须满足:Content-Type: text/x-cross-domain-policy
另:
当Flex访问WebService服务时,在本地能够正常访问,当部署到web容器中发布为web服务后,再调用WebServicIE,此时就会被拒绝访问,这就是Flex跨域访问的沙箱问题,
为了解决Flex跨域访问WebService的问题,可采用如下方案:
首先,跨域访问被拒绝是因为提供服务方没有配置安全策略文件,即crossdomain.xml,如果你不想用crossdomain.xml就要用到代理,即自己写一个后台读取webservice,然后提供给自己的flex应用,因为在flashplayer中,要跨域必须要有策略文件。考虑到 flashplayer升级到9.124之后,加强了安全性,之前的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="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
表示该服务允许任何外域来访问。
关于crossdomain.xml的放置目录问题,有如下解决方案,可放置在:
1) 如果这个目录是容器的根目录,可以通过以下的url访问crossdomain.xml:
http://localhost:8080/crossdomain.xml 。
2) 如果crossdomain.xml不是放在根目录下,而是在某个webapp下面,在flex中就需要在初始化的时候应用
Security.loadPolicyFile("http:// localhost:8080/aaa /crossdomain.xml");
其中aaa为webapp的名称
这样,外部Flex访问该服务发布的WebService时,flashplayer首先找的就是crossdomain.xml文件,若安全机制设置为允许访问,则访问成功。