2011-09-12 75 views
7

我有一个iframe是:IE9失去了饼干后重定向

  1. 做一个POST请求服务器
  2. 服务器返回302,并设置cookie的
  3. 浏览器不保存Cookie,但做了后(不知道为什么没有得到,但它并不重要)
  4. 饼干从#3丢失

我已经找到了解决办法:

Response.AddHeader("Pragma", "no-cache"); 
Response.AddHeader("Cache-Control", "no-cache"); 

但它没有帮助。 mb有人知道什么可以解决这个问题?

+0

这篇文章似乎回答了这个问题:http://stackoverflow.com/questions/389456/cookie-blocked-not-saved-in-iframe-in-internet-explorer – sammcd

回答

11

您可能想了解您的浏览器为什么做POST而不是GET,因为这意味着您忽略了一条重要的信息。没有浏览器将follow a HTTP/302 redirect with a POST

在IE9,redirection responses are cached如果标头允许(IE8及以下不会缓存重定向)。

你可以绝对地在302重定向上设置一个cookie。有两种可能的位置:

  1. 你的cookie被越来越下降了,因为你没有就表明您的隐私做法不符合用户的期望相适应的响应提供一个P3P头。
  2. 您的重定向响应从用户的缓存中获取,而不是服务器,并且缓存的响应未设置cookie。

鉴于您在IFRAME中遇到此问题,#1似乎更有可能。 (请参阅Quick Look at P3P

+0

但为什么一切都ok了用wf中的cookies ,铬和歌剧?他们保存cookie并通过get重定向。 – donRumatta

+1

我有同样的问题,并通过添加一个P3P头,如上所述,很容易解决它。有关完整说明,请参阅http://msdn.microsoft.com/en-us/library/ms537341.aspx,但如果您只是想快速修复,请将此标题添加到您的302响应中: 'P3P:CP =“NOI ADM DEV PSAi COM NAV OUR STP IND DEM“' – nitwit

+3

只有IE支持P3P。按照事先评论的建议添加标题之前,您必须确保您使用该标题制作的声明是正确的,否则您有可能因为对您的隐私惯例作出虚假声明而被起诉。 – EricLaw

0

我不知道如果你想到这一点,但确保你指示你的应用程序不设置客户端Cookie。在CF中,有一个应用程序参数'setClientCookies',将其设置为false时,确保您描述的内容不会发生。 (巧合的是,将它设置为'false'或'no'不起作用,因为CF通常也认为这是错误的。)

2

这个职位可能有点晚,但我最近处理这是Grails应用程序的特殊问题。多年前,我在创建Internet Explorer阻止Cookie(隐私设置)的Java Web应用程序中发生了同样的问题。为了允许Java Web应用程序和JavaScript在Internet Explorer的主页面或IFRAME中写入Cookie,从Web应用程序发送了隐私策略。Microsoft仍支持称为Platform for Privacy Preferences (P3P)的隐私政策格式。这种格式在其他现代浏览器中似乎不受支持,但它确实有助于克服IE cookie问题。尽管担心IE 10支持P3P,但我已通过严格验证成功测试了以下P3P设置。

1)确定您的应用程序所需的类别。我的应用程序中,互动导航,并UNIQUEID类别都必须正常工作。紧凑策略代码在P3P规范站点上列出

Category  Compact 
--------  ------- 
interactive => INT 
navigation => NAV 
uniqueid => UNI 

2)确定紧凑型策略是否会起作用。对于我的申请,紧凑的政策头是足够的。如果您需要策略文件,请在此查看一些示例文件:http://p3pbook.com/examples.html

3)下面的代码是一个非常简单的例子,但仍应该说明要执行的步骤。

HttpServletResponse response = (HttpServletResponse) res; 

String policySettings = policyFileExists ? "policyref='" + policyFilePath + "', " : ""; 

policySettings += "CP='INT NAV UNI'"; 

response.setHeader("P3P", policySettings); 

你当然可以执行其它技术,如PHP和ASP.NET类似的步骤。我希望这至少有助于指出人们正确解决IE cookie问题的方向。

0

您可能想要检查cookie上的Expire vs. Max-Age设置。 IE不会考虑Max-Age(如果没有给出Expire,可能是新版本),但它们会查看当地时间并将其与Expire日期进行比较。如果将来有本地时间,或者服务器有过去的日期,则该cookie将被视为过期,并且不会在下一次请求时发送。

我也注意到,即使IE9会在开发者界面中告诉你它做了一个POSt,它在302重定向之后确实会做一个GET。作为一个说明,整个302的东西有点搞砸,网站应该你303和307,但无论如何。