ie9重定向后丢失cookie

时间:2011-09-12 07:18:23

标签: cookies redirect internet-explorer-9

我有一个iframe:

  1. 向服务器发送帖子请求
  2. 服务器返回302并设置cookie
  3. 浏览器不会保存cookie,但会发帖子(不知道为什么不能获得,但没关系)
  4. 来自#3的
  5. cookie丢失
  6. 我找到了一个解决方法:

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

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

5 个答案:

答案 0 :(得分:11)

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

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

您绝对可以在302重定向上设置Cookie。这里有两种可能性:

  1. 由于您未能在回复中提供P3P标头,表明您的隐私惯例与用户的愿望兼容,因此您的Cookie被删除。
  2. 您的重定向响应是从用户的缓存而不是服务器中提取的,缓存的响应没有设置cookie。
  3. 鉴于您在IFRAME中遇到此问题,#1似乎更有可能。 (见Quick Look at P3P

答案 1 :(得分:2)

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

1)确定您的应用程序所需的类别。对于我的应用程序, 交互式 导航 uniqueid < / strong>正确操作需要类别。 Compact Policy代码列在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问题的正确方向。

答案 2 :(得分:1)

要扩展EricLaw关于IE 9缓存重定向响应的答案,请查看此页面:

http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

此外,有关缓存重定向响应的一点需要注意的是,确实没有简单的方法来清除它们。清除缓存和cookie会使它们保持原位。有两个选项:

  • 进入IE 9私密模式
  • 使用Fiddler清除Wininet缓存(在工具下)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可能需要检查Cookie上的“过期与最大年龄”设置。 IE不会考虑Max-Age(如果没有Expire,可能会更新吗?),但他们会查看当地时间并将其与Expire日期进行比较。如果当地时间在将来,或者服务器具有过去的日期,则该cookie将被视为已过期,并且不会在下一个请求中发送。

我还注意到,即使IE9会在开发人员界面中告诉你它执行了一个POSt,它确实在302重定向后进行了GET。作为一个注释,整个302的事情有点混乱,网站应该303和307,但无论如何。