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

时间:2009-11-11 16:52:19

标签: cookies persistent

所有

虽然我在论坛上看到相关主题,但我没有看到关于这个问题的明确解决方案。 我试图设置一个具有过期时间的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。这在所有其他浏览器上再次正常工作。

请帮忙。 感谢。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

答案是Persistent cookies from a servlet in IE

您的案例可能是同一问题的另一种情况:即,通过在域前添加“。”。 (我很确定它是一个版本1的cookie功能),Java堆栈中的某些东西决定它是一个版本1的cookie(无法识别并且不被IE持久化,甚至IE8)并发送该cookie格式。

或者,正如答案所暗示的那样,你的cookie值中是否包含一个无法识别的字符?

答案 2 :(得分:1)

由于javax.servlet.http.Cookie不允许您为Cookie设置Expires属性,因此您应手动设置。

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

在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());
}