主题:【原创】frame中的cookie被ie拒收 -- 铁手
==问题解决了。具体归纳在最后,并总结了一下网上找到的资料。
遇到大难题了。
比如在一个网页中包含若干个 frame ,每个frame是来自不同域名的内容。一般情况下,各个frame里的内容显示都不会有问题,但是,如果某个frame里的页面要设置 cookie,而且这个域名和主页面的域名不同的话,问题就来了。
<p>none sense</p>
<iframe src="域名甲"></iframe>
<iframe src="域名乙"></iframe>
<p>more none sense</p>
如果“域名甲”,“域名乙”都需要设置自己的cookie的话,就会涉及到所谓的第三方cookie问题。Firefox可以允许frame中的cookie设置,没有任何问题。在ie中,缺省设置下,privacy 被设定为 medium,也就意味着frame中“域名甲”,“域名乙”的cookie会被当作第三方cookie被 block 掉,从而无法在各个frame中设置各自域名的cookie。出现这种情况的时候,你会在ie的底部状态条上看到一个眼睛的图示,点击那个图示,就可以看到相关的提示信息。
怎么办?
要求用户修改 privacy 的设置?基本上没有这个可能性,不要说很多人根本就不知道在哪里设置。
在网上搜索、研究了很长一段时间,最后终于找到了大概是唯一的解决途径,就是利用 p3p。在上面的例子中,可以在“域名甲”的页面内容里增加 一些p3p的内容来告诉ie说这个页面没有问题,可以接受cookie。
在 php 中可以:header('P3P: CP="CAO PSA OUR"');
在 asp 中可以:Response.AddHeader "P3P","CP=""CAO PSA OUR"""
其中的 CAO,PSA,OUR 每个代码各自代表一定的privacy policy的含义。选择不同的代码,就可以让浏览器,特别是 ie 来接受frame中的cookie。
奇怪的是,换了一个服务器(域名乙)后,居然就不行了。虽然“域名甲”和“域名乙”的链接内容完全一样,“域名乙”中的cookie被block。查了两个域名页面的 header,都包含P3P的内容。
搞不懂问题在哪里了。程序应该没有问题。难道是服务器,或者是web server的什么地方设置有问题,导致header有问题?
刚才又试验了一下,发现在ie中,frame中的cookie被block,如果单独把frame中的地址拿出来,cookie没有被设置。
邪门邪门。不知道有没有对这方面比较熟悉的,或者有什么想法的?急切需要帮忙。
---最后问题得到了解决。
主要是因为服务器时间设置所出现的错误。服务器时间晚一天,而cookie设置为当前时间60分钟后失效,结果ie认为cookie的时间已经过期,就没有接受cookie,firefox则根据相对时间调整到客户端。
另外,需要设置合适的p3p。
从网上查到的资料显示,如果域名中包含下划线,也会导致ie出现问题。
本帖一共被 1 帖 引用 (帖内工具实现)
你自己也知道,你这种情况浏览器可以拒绝cookie。
你可以看看,把需要的cookie设置搞成javascript, 然后让javascript设置cookie
不过感觉也够呛~~~
服务器生成的页面搞成这样
<script language="javascript">
function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}
setCookie("<?=$cookieName?>", "<?=$cookieValue?>", null);
</script>
现在的问题是,在这个服务器上的域名的cookie,如果是在frame中的的话,就会被ie 拒收。如果是在客户端设置,大概会有同样的问题,因为cookie的设置还是在frame中,还是会继续有 privacy policy 的问题。
最重要的是,在其他服务器的域名上都没有问题。肯定是和服务器的设置有关系。就是不知道可能的原因在哪里。
看了一下P3P的介绍 感觉他应该是设置在主页面,
也就是那个发送
<p>none sense</p>
<iframe src="域名甲"></iframe>http://www.ccthere.com/article/1747051
<iframe src="域名乙"></iframe>
<p>more none sense</p>
这个页面的服务器来发送 P3P 的报头。
主页面利用这个P3P的声明告诉浏览器:我的页面里面会包含第三方的网页,第三方会要求设置cookie。
对不?