问题
参与一个客户端产品的开发,这个产品有几个模块的开发方式是这样的,C++代码调用浏览器组件加载本地一个html页面,这个页面主要是展现一些边框、条幅,为的是跟C++开发的模块的风格看起来像,这个页面的主要内容是通过iframe调用别的web服务器的页面的。
今天一个模块的出问题了,经过定位,问题是这样的:iframe引入的页面设置了一个cookie,但后续的js请求数据时却没有发送这个cookie,而服务器会检查这个cookie,所以验证失败,在客户端表现为没响应。
问题缘由
IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification) 协议默认阻止第三方无隐私安全声明的cookie。
在默认情况下IE会自动禁用第三方站点(不同域的站点)的cookie, 也就是在请求第三方站点的某url时在HTTP header里不发送它们的cookie。
在这个客户端产品里,浏览器组件首先加载的是本地的html页面,然后用iframe加载web服务器的一个页面,那么web服务器的页面所在的域与于本地的页面所在的域是不同的,就存在跨域了,所以浏览器组件阻止发送cookie。
解决方法
一个简单的解决方法是设置 p3p 头,让浏览器(特别是IE)允许第三方cookie。由第三方服务器设置。
在jsp里面可以这样设置: response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"")
P3P
P3P 是Platform for Privacy Preferences的简称,目的是创建一个标准的、机器可读的隐私策略框架。
P3P设计允许web站点传递自动的隐私声明,让用户浏览器有可能检查声明,并在合适的时候基于这些实践自动决定(是否接受cookie)。
设置P3P头的两种方式
- 设置
PolicyRef
头,如:P3P: policyref="http://catalog.example.com/P3P/PolicyReferences.xml"
。 -
紧凑的策略,如:
P3P: "CP=IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
,各个策略用空格分开。
具体的策略设置语法如下:
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"
参考链接
http://www.w3.org/2002/04/P3Pv1-header.html
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。