"过期"属性指向过去的日期

时间:2014-06-22 12:32:41

标签: cookies struts2 jboss

我正在尝试为我的网站设置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。

1 个答案:

答案 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属性值。