初来乍到,看到一篇cookie夸域的帖子,觉的他只是解决了跨二级域名的问题,自己曾经作过一个企业应用的sso,其中用到的p3p解决了cookie跨域的存取。 

第一次发帖,请各位高手多多指教 


首先介绍第一方Cookie和第三方cookie: 

第一方Cookie是来自当前正在查看的网站,或者发送到当前正在查看的网站。 


第三方Cookie是来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者iframe的别的网站的url,这些第三方的网站可能使用的Cookie。 


然后是P3P,Platform for Privacy Preferences: 

P3P由万维网协会研制,它为Web用户提供了对自己公开信息的更多的控制。 

支持P3P的Web站点可以为浏览者声明他们的隐私策略。 

支持P3P的浏览器 则可以将Web站点的策略与用户的隐私偏好进行对比,并为用户提出不匹配的警告。 

因此,用户可以被通知有关Web隐私的处理方式。 

更详细的说明请看http://www.w3.org/P3P/的介绍 


以上几乎都是废话,我自己的理解就是通过P3P 可以使 用户自己指定浏览器的隐私策略。而这里只用到了关于cookie的一些设置。 

我们打开ie浏览器-->工具-->internet选项-->隐私分页 用户可以通过手工 “导入” 用户隐私策略文件 


通过指定用户隐私策略,就可以达到存取第三方cookie的目的,看到这也许会觉得跟web应用毫无关系,真正的问题是如何让服务器来指定用户浏览器的隐私策略? 


其实很简单,只要在响应用户请求的时候在http的头信息中增加关于p3p的配置信息就可以了


用java实现这样的功能,只要在被跨域请求的HttpServlet中加入 

 

response.setHeader("P3P","policyref=\"http://www.xxxx.com/xxx/w3c/p3p.xml CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

就可以了 


当然p3p还提供了一种简单的方式 ,来加载用户隐私策略 

通过IBM p3p的工具可以看到,CP=后面的字符串分别代表不同的策略信息,只要在http响应的头信息中增加 

 

response.setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

而无需指定隐私策略文件也可以达到指定隐私策略的目的