从 Java 设置持久性 cookie 在 IE 中不起作用

Posted

技术标签:

【中文标题】从 Java 设置持久性 cookie 在 IE 中不起作用【英文标题】:Setting persistent cookie from Java doesn't work in 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 【参考方案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设置,不用单引号。 (然后这将从传递的语言环境中读取时区)。

以上是关于从 Java 设置持久性 cookie 在 IE 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

cookie的弊端

JAVA设置HttpOnly Cookies

以域管理账户连接到TFS或git时,设置IE允许Cookies

跨子域的Cookie

cookies不设置过期时间默认是永远不过期吗

如何通过express-session在node.js上设置持久性cookie?