IE下iframe不同域操作cookie的解决方法

这周花了不少时间在IE浏览器上,有一个项目是基于IE内核浏览器而且应用场景是在IE下IFRAME来实现,并且IFRAME和父级窗口不同域,而且要操作COOKIE,估计很少人碰到这种场景,但这就被我碰到了。 刚开始的时候不太相信IFRAME里面的页面操作自己的cookie竟然会出现问题,但遇到IE我就感觉自己弱爆了,果然会碰到这么一个问题。于是乎想办法解决,读到了_Franky 的《关于p3p 简洁策略,以及浏览器的支持情况.》才对P3P有了进步一步的了解。但是抛开教主对P3P的解释,我认为P3P就是一个旧时代的产物,完全是因为MS太敏感导致。就像Fenng《对操作系统的迷思》一样,太敏感造就了这种复杂,反而没有带来任何好处。 下面以a.com嵌入b.com为例: 本来以为b.com在加载的时候声明P3P,就可以读到b.com的任何cookie,结果表名这样是不可行的,在写cookie操作的页面必须有P3P的声明,JS和同域服务程序才可以读到。但JS的写依然是有问题的。如何让JS可写呢? 教主提供了一个方法(原文地址) 如果你非要用在ie6下,用js写cookie. 那么有一个很悲剧的做法.. 服务器端给资源配置可缓存.(包括反向代理和客户端.) 然后想办法在IE6的时候刷新一次页面.这样就ok了. 刷新时一定要用 location.reload(false)  即先忽略客户端缓存.尝试304服务器端校验客户端缓存可靠性..这样做的好处是.即保证了 cookie的写入性. 又保证,如果页面是静态资源.则反向代理的可用性.. 否则还是直接用动态资源,http方式去写好了.  需要注意的是.除了页面刷新.譬如其他方式加载页面资源.试图通过预读其p3p简介策略头.是无效的. 比如 用 script type=”text/c” 方式去预读一次. 如果你有这个想法。还是早早放弃的好.  个人觉得这种方案可靠性不是很好,索性直接用服务端来实现,在JS写如的时候,使用服务端提供的接口去写COOKIE,这样可以很简单的绕过这个问题。但需要让JS访问写入接口的时候阻塞执行,以避免产生后面COOKIE无法读到产生的问题。 实现写入接口:/api/v1/cookie/set?key=xxx&value=xxx&timeout=xxx
<?php
header("P3P: CP=."); //简洁策略
setcookie($_GET['key'], $_GET['value'], $_GET['timeout'], '/');  //存储在代理下根目录下
?>
附上SO的关于这种问题的详细解答 http://stackoverflow.com/questions/389456/cookie-blocked-not-saved-in-iframe-in-internet-explorer

Comments