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