我正在尝试为我的网站设置Cookie。我正在使用:
ServletActionContext.getResponse().addCookie(<my cookie instance>);
Cookie maxAge设置为&#34; 2592000&#34;。但是......出于某种未知原因,标题看起来像这样:
Server:Wildfly 8
Set-Cookie:LOCALE=en_GB; path=/scores;
Max-Age=2592000; Expires=Mon, 02-Jun-2014 19:17:54 GMT
今天是根据标题:
Date:Sun, 22 Jun 2014 12:20:41 GMT
,所以我很惊讶为什么&#34; Expires&#34;字段日期指向过去的日期。我完全没有想法。任何提示我都会感激不尽。也许我需要配置一些东西?
编辑: 这是我创建Cookie的方法:
public Cookie getCookie(final String name, final String value, final int maxAge, final HttpServletRequest request)
{
final Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(maxAge);
cookie.setPath(request.getContextPath());
cookie.setSecure(false);
return cookie;
}
EDIT2: 我刚刚注意到使用Jboss 7时发送到浏览器的标题格式之间存在差异。没有Max-age存在 - 只计算(并且正确)到期时间。
Server:Apache-Coyote/1.1
Set-Cookie:LOCALE=en_GB; Expires=Tue, 22-Jul-2014 13:44:00 GMT; Path=/scores
似乎应该以某种方式配置Jboss 8 Wildfly以计算cookie到期时间。不幸的是我必须使用Wildfly。
答案 0 :(得分:1)
我还在浪费时间(我今天已经失去了8小时)试图解决这个问题,但是......我已经找到了一个解决方法(可以帮助将来的某个人)和一个有趣的事实。
代码行如下所示:
ServletActionContext.getResponse().addCookie(newInstance(name, value, maximumAge, request));
我已被这个取代:
protected void set(final String name, final String value, final long maximumAgeInSeconds, final HttpServletRequest request)
{
// ServletActionContext.getResponse().addCookie(newInstance(name, value, maximumAgeInSeconds, request));
ServletActionContext.getResponse().addHeader("Set-Cookie", cookieValue(name, value, maximumAge, request));
}
protected static String cookieValue(final String name, final String value, final long maximumAgeInSeconds, final HttpServletRequest request)
{
final SimpleDateFormat cookieExpiresHeaderFormat = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss zzz");
cookieExpiresHeaderFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
final Date d = new Date();
d.setTime(d.getTime() + maximumAgeInSeconds * 1000L);
final String cookieLifeTime = cookieExpiresHeaderFormat.format(d);
return name + "=" + value + "; Expires=" + cookieLifeTime + "; Max-Age=" + maximumAge + "; Path=" + request.getContextPath();
}
那个工作正常,似乎我在Jboss 8中发现了一个错误,或者......任何将cookie转换为标题的库。 如果maxAgeInSeconds变量等于30天,则转换为毫秒2592000 * 1000 = 2592000000重叠MAX_INT(即2147483647),因此它的值变为&#34; -1702967296&#34; !!!!
示例:
当前时间:1403460809297 - 1702967296 =(以秒为单位)1401757842
这是: GMT:Tue,03 Jun 2014 01:10:42 GMT
这就是为什么我从过去收到过期日期的原因。它似乎是一种将Cookie对象Max-Age属性转换为&#34; Expires&#34; Cookie标头的属性使用INTeger而不是更宽的Long类型意外设置cookie过去的过期日期。 有趣的是,该问题适用于IE,但不适用于Chrome,例如,使用Max-age进行内部到期时间计算,省略Cookie中的到期时间。在这种情况下,IE省略了Max-Age属性值,已经计算了已接收Cookies的Expires属性值。