今天碰到一个问题,就是在IE下,使用iFrame嵌入页面时,该页面的会话级别的cookie无法写入,导致服务端始终无法获取JSESSIONID,每次都是产生一个新的,使得Session无法使用。

通过网上大量的搜索发现原来IE的iframe有特殊之处, 默认情况下, IE如果发现iframe的域和父页面的域不同, 则会禁止iframe页面写入Cookie(Session在默认情况下就是通过Cookie保存一个SessionID的)。

网页设计

如果将IE设置->隐私的级别调至最低, 也就是接受任何Cookie, 那么是运行正常的。

网页设计

如果你按照上面操作并且你的问题解决了说明确定是IE这个特性导致的。 接下来我们将解决这问题。

问题怎么出现的呢也许你会好奇。

原因是P3P

从本质上来说,P3P 策略是由一系列多选项问题的答案组成的,因此,它并不总像一个人类可读的隐私策略那样包含许多信息细节(例如,用英语或者其他某种口语语言写成的策略是用来让人阅读的,而不是让计算机识别的)。P3P策略的标准格式使它便于自动处理。同 样 ,P3P规范也包含有用于请求和传输P3P策略的协议.P3P协议所基于的HTTP协议与 Web 浏览器用来与 Web服务器进行通信的 HTTP 协议相同。如图 1-1 所示,P3P 的用户代理使用标准的 HTTP 请求从 Web 站点上一个众所周知的地方获取 P3P 策略引用文件,并发送给发出请求的用户。这个策略引用文件指出了Web站点上各个部分所应用的P3P策略文件的位置。整个站点有可能只应用了一种策略,也可能是网站的不同部分分别应用了几种策略。这样用户代理就可以根据用户的选择来获取合适的策略,将其解析出来并采取相应的动作

P3P 也允许站点在其他位置放置策略引用文件。在这些情况下,站点在声明策略引用文件的位置时,必须使用一个特定的 HTTP 报头,或者在应用了 P3P 策略的html 文件内嵌入一个 link 标 记 。 不论在何时设置cookie都可以用特定的HTTP报头来传送一个可选的 P3P 简洁策略.简洁策略是完整 P3P 策略的一个短小摘要,仅描述了与cooki e 相关的数据处理方式,并且不需要P3P 策略的完整的表达性能。

如何使Web站点支持P3P:

从技术角度看,使 Web站点支持 P3P 是一个很容易的过程。但是,它要求网络运营商在审视数据处理方式时比以前更加仔细,并要求他们协调域内各个主机上的策略和处理方式。以下是如何使站点支持P3P 技术的具体步骤。

  1. 创建一个隐私策略。
  2. 分析 cookie 的使用情况以及您的站点上的第三方内容。
  3. 确定要对整个站点应用一个P3P策略还是对站点的不同部分应用不同的P3P 策略。
  4. 为站点创建一个或几个 P3P 策略。
  5. 为站点创建一个策略引用文件。
  6. 为 P3P 配置服务器。
  7. 测试站点,以确定它确实支持 P3P。

大多数支持P3P的Web站点会在每台服务器上放置一个P3P策略引用文件,同时它还会在中央服务器上放置一个或多个P3P策略。这些站点也会将自己的服务器配置为用户在设置 cookie 时发送 P3P 的简洁策略。P3P 策略包括以下信息:

● 如何与拥有该站点的公司、组织或个人进行联系的信息。

● 用户是否可以查找该站点的数据库中保存了自己的哪些个人信息。

● 如何解决与站点之间有关隐私的纠纷(如客户服务台、隐私封印以及与隐私相关的法律等)。

● 所收集数据的种类。

● 所收集数据的使用方式,以及用户是否能选择接受或拒绝这些用途。

● 信息是否会被共享以及何时被共享,用户是否有选择的权力。

● 对所收集的用户信息进行定期清除的策略。

HTTP Response Header :

参考资源:http://www.w3.org/2002/04/P3Pv1-header.html

Compact Policies(简洁策略)

简洁策略,本质上就是P3P策略的一个摘要. 他们的作用是,使用户代理,可以快速敏捷的获取到站点的P3P策略信息,所以是对性能有益的.

我们常用的简洁策略的 P3P头为 - P3P : CP=CAO PSA OUR

总结下浏览器支持情况:

网页设计

既然知道这么多了,我们来解决问题吧。 以PHP为例子 解决这些问题,归根结底只需要一条语句设置一下header,在PHP中,如下:


header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

PS:如果是使用session的话,这条语句请使用在session_start();之前,如果是使用cookie,请在setcookie之前设置header。

当然,比较容易想到。另外的解决办法就是在URL中加入sessionid。对此就不举例了。

更多