【问题标题】:Setting persistent cookie from Java doesn't work in IE从 Java 设置持久性 cookie 在 IE 中不起作用
【发布时间】:2009-11-11 16:52:19
【问题描述】:

全部,

虽然我在论坛上看到了相关的话题,但是我没有看到关于这个问题的明确解决方案。 我正在尝试设置一个具有过期时间的 javax.servlet.http.Cookie(以便它在浏览器会话中持续存在)。代码:

public void respond(HttpServletRequest req, HttpServletResponse resp) {
    int expiration = 3600;
    Cookie cookie = new Cookie("TestCookie", "xyz");
    cookie.setDomain("");
    cookie.setVersion(0);
    cookie.setPath("/");
    cookie.setMaxAge(expiration);
    cookie.setSecure(false);
    resp.addCookie(cookie);
}

当我签入 IE 开发人员工具时,我没有看到此 cookie 被设置。在互联网上搜索给了我线索,IE 不考虑 Max-Age,但只适用于 Expires。如果这对 IE 不起作用,那么是否有一种行之有效的方法可以为持久性 cookie 设置 HTTP 响应标头,以便它适用于 IE?

PS:这适用于所有其他浏览器。

我尝试为具有 expires 属性的 cookie 创建一个字符串。 IE 成功创建它,但它丢失了域(默认 - “”)并显示“.com”并将其转换为会话 cookie 而不是持久性 cookie。这同样适用于所有其他浏览器。

请帮忙。 谢谢。

【问题讨论】:

  • 任何版本的 IE,特别是 IE8

标签: cookies persistent


【解决方案1】:

在使用 IE9 时,我发现需要 HttpOnly 属性才能让它在后续帖子中回显 cookie 值,例如:

Set-Cookie: autologCk1=ABCD; Path=/autolog/; HttpOnly

【讨论】:

    【解决方案2】:

    答案在Persistent cookies from a servlet in IE

    您的案例可能是同一问题的不同风格:即,通过在域前加上“。” (我很确定这是第 1 版 cookie 功能),Java 堆栈中的某些内容决定它是第 1 版 cookie(IE 甚至 IE8 都无法识别且不会持久化)并发送该 cookie 格式。

    或者,正如该答案所暗示的,您的 cookie 值中是否存在包含无法识别字符的内容?

    【讨论】:

      【解决方案3】:

      由于javax.servlet.http.Cookie不允许你为cookie设置Expires属性,你应该手动设置。

      您还需要知道Expires 必须以Wdy, DD Mon YYYY HH:MM:SS GMT 的形式指定在RFC-2616 完整日期部分(more info) 之后。

      在 Java 中你可以这样做:

      public void respond(HttpServletRequest req, HttpServletResponse resp) {
          int expiration = 3600;
          StringBuilder cookie = new StringBuilder("TestCookie=xyz; ");
      
          DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'", Locale.US);
          Calendar cal = Calendar.getInstance();
          cal.add(Calendar.SECOND, 3600);
          cookie.append("Expires=" + df.format(cal.getTime()) + "; ");
      
          cookie.append("Domain=; ");
          cookie.append("Version=0; ");
          cookie.append("Path=/; ");
          cookie.append("Max-Age=" + expiration + "; ");
          cookie.append("Secure; ");
          resp.setHeader("Set-Cookie", cookie.toString());
      }
      

      【讨论】:

      • 顺便提一下,上述日期格式中的“GMT”可以用z设置,不用单引号。 (然后这将从传递的语言环境中读取时区)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多