Cookie 未在 IE9 的 iframe 中发送
Posted
技术标签:
【中文标题】Cookie 未在 IE9 的 iframe 中发送【英文标题】:Cookie not being sent in iframe in IE9 【发布时间】:2011-09-19 07:30:44 【问题描述】:首先,我在发布这个问题之前做了一些研究,所以我知道the P3P Policy 和the MSDN article 关于它。据我了解,该政策主要(如果不是仅)适用于 IE6。我的具体问题是 IE9。此外,我做的第一件事是制定了一项政策(它很有效,因为它在 IE 的隐私报告中显示了一个摘要)。
我的测试用例如下:我有一个包含 iframe 的页面。 iframe 文档在根路径上为当前域设置了一个会话 cookie(完整的 HTTP 标头:Set-Cookie:sid=2b5540e0e4f27075ca4709851700137d; expires=Tue, 28-Jun-2011 07:27:41 GMT; path=/
),一周后到期。那里没有问题,这已经在生产中运行了一段时间(独立,而不是在 iframe 中)。
问题是这样的:iframe 文档有一些 javascript,它首先执行一些 HTTP 请求(由 jQuery 完成),然后重定向用户(通过更改 document.location
属性)。请求会发送 cookie,但重定向不会。
我已经在 IE 中捕获了网络事件,我能找到的两种请求之间的唯一区别是发起者:XHR 是由一个 JS 库完成的,另一个是通过点击完成的。但是我真的怀疑点击不会发送 cookie。
我想知道为什么我的 cookie 没有发送,Google Analytics cookie 被发送了,所以应该可以。
更新: 这绝对是一个隐私区域问题:将 IE 中的隐私栏设置降低到全部时,它可以工作。其他所有设置均失败。
我创建了an exact test bed:这是实际使用的 iframe。要对其进行测试,您必须填写荷兰邮政编码(对不起;)),使用的占位符很好:1234 AB 和 1。提交后您会得到一个模态,完成后您应该被重定向到结果页面。在 IE 中,重定向显示与您开始时完全相同的页面(因为未设置 cookie)。
【问题讨论】:
您可能知道,IE9 的隐私保护更加严格。可能是您的政策中的一两件事导致 cookie 被阻止。是否可以共享您正在使用的策略文件代码? 我最近在所有版本的 IE 中都遇到了问题,直到我发送了正确的 P3P 标头。同样的问题,不会在 iFrame 中设置 cookie @Mrchief 我也考虑过这一点,所以我尝试了不同的策略:首先我认为该站点是准确的(使用 IBM 策略编辑器中的 webshop 模板),但为了测试我也尝试了其他网站的政策,这适用。 彼得,你有没有想出解决这个问题的办法? 其实它现在已经解决了,虽然我不确定是什么解决了它。可能是 IE 的缓存,它可以很持久,或者我自己改变了什么,我不能说。它只是在几天后工作。我很担心我没有找到真正的原因,但我很高兴它终于起作用了。 【参考方案1】:您是否尝试过添加 P3P 标头?没有那篇文章说的那么难。
例如在 php 中,只需在 php 文件的顶部添加此标头:
<?php
header('p3p: CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
?>
这个确切的问题,但在不同的背景下在这里工作:Facebook app works on all browsers but not IE8
【讨论】:
正如我所说,我首先添加了策略。 将该代码添加到 iframe 代码或创建 iframe 的父窗口?【参考方案2】:如果有人试图为 .NET 应用程序解决这个问题
如 Carlos 所述添加 P3P 标头
HttpContext.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
编辑: 更好的是,如果你想把它放在Controller中,只需添加以下属性
public class IEP3PHeaderAttribute : FilterAttribute, IResultFilter
public void OnResultExecuting(ResultExecutingContext filterContext)
// check if the user is using a IE based browser, add a p3p header if true and hasn't already been added
if (HttpContext.Current.Request.Browser.Browser.ToUpper().Contains("IE"))
if (System.Web.HttpContext.Current.Response.Headers["p3p"] == null)
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
public void OnResultExecuted(ResultExecutedContext filterContext)
然后在您的控制器中,例如家庭控制器
[IEP3PHeader]
public class HomeController
public ActionResult DoSomething() ;
public ActionResult DoSomethingElse() ;
【讨论】:
【参考方案3】:这是否与生成 cookie 的顺序有关 - 即 GA cookie 在 iframe 加载之前是否存在,但会话 cookie 在加载时设置?
代码在哪里?
通过更改 document.location 属性
您是直接为位置对象赋值,还是使用 location.replace() 或 location.href=...?
【讨论】:
GA cookie 可能在加载 iframe 之前就已经存在,是的。这是因为 iframe 是已经投入生产的网站的子集。重定向是通过为document.location.href
分配一个新值来完成的。【参考方案4】:
这是对您的测试台的正确复制吗? http://www.coderun.com/ide/?w=EyTizeGw9kKgHjwNp3xiPw
我在 IE9 中恢复了 cookie,我错过了什么?
【讨论】:
我的例子是跨域的:iframe 是从不同的域加载的。检查更新的问题以获得更准确的测试。以上是关于Cookie 未在 IE9 的 iframe 中发送的主要内容,如果未能解决你的问题,请参考以下文章
jQuery-File-Upload 未在 Internet Explorer (IE9) 中触发完成回调
Soundcloud HTML5 播放器未在 IE9 中显示
在 IE9 的内部 iframe 中忽略 EmulateIE8