7

全部,

虽然我在论坛上看到了相关的话题,但是我没有看到关于这个问题的明确解决方案。我正在尝试设置一个具有过期时间的 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。这同样适用于所有其他浏览器。

请帮忙。谢谢。

4

3 回答 3

4

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

Set-Cookie: autologCk1=ABCD; Path=/autolog/; HttpOnly
于 2012-09-12T18:19:00.473 回答
1

由于javax.servlet.http.Cookie不允许您为Expirescookie 设置属性,您应该手动设置它。

您还需要知道Expires必须以Wdy, DD Mon YYYY HH:MM:SS GMT以下RFC-2616完整日期部分(更多信息)的形式指定。

在 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());
}
于 2012-01-17T17:38:50.197 回答
1

答案是来自 IE 中的 servlet 的 Persistent cookies

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

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

于 2009-12-10T14:43:46.527 回答