Cookies 从Java设置持久cookie不会';我不在IE工作

Cookies 从Java设置持久cookie不会';我不在IE工作,cookies,persistent,Cookies,Persistent,全部, 虽然我在论坛上看到了相关的话题,但我没有看到关于这个问题的明确解决方案。 我正在尝试设置一个javax.servlet.http.Cookie的过期时间(以便它在浏览器会话中保持不变)。代码: 当我签入IE开发者工具时,我没有看到这个cookie被设置。在互联网上搜索让我知道IE不考虑Max Age,但只工作到期。如果这不适用于IE,那么是否有一种经过验证的方法可以为持久性cookie设置HTTP响应头,从而使其适用于IE PS:这在所有其他浏览器上都可以正常工作 我尝试为具有expir

全部,

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

当我签入IE开发者工具时,我没有看到这个cookie被设置。在互联网上搜索让我知道IE不考虑Max Age,但只工作到期。如果这不适用于IE,那么是否有一种经过验证的方法可以为持久性cookie设置HTTP响应头,从而使其适用于IE

PS:这在所有其他浏览器上都可以正常工作

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

请帮忙。 谢谢。

答案在

您的案例可能与同一问题不同:也就是说,通过在域前面加“.”(我很确定这是版本1的cookie特性),Java堆栈中的某些东西决定它是版本1的cookie(IE甚至IE8都无法识别和保存),并发送该cookie格式


或者,正如这个答案所暗示的,您的cookie值中是否存在无法识别的字符?

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

您还需要知道,
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());
}

使用IE9时,我发现需要
HttpOnly
属性才能使其在后续文章中回显cookie值,例如:

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

IE的任何版本,特别是IE8,只需提及上述日期格式中的“GMT”可以设置为
z
,而无需单引号。(这将从传递的区域设置中读取时区)。
Set-Cookie: autologCk1=ABCD; Path=/autolog/; HttpOnly