问题
参与一个客户端产品的开发,这个产品有几个模块的开发方式是这样的,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笔记,可以更及时回复你的讨论。
