gpt4 book ai didi

cookies - "Expires"属性指向过去的日期

转载 作者:行者123 更新时间:2023-12-02 20:58:14 28 4
gpt4 key购买 nike

我正在尝试为我的网站设置 cookie。我正在使用:

ServletActionContext.getResponse().addCookie(<my cookie instance>);

Cookie maxAge 设置为“2592000”。然而......由于某种未知的原因,标题看起来像这样:

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

,所以我很惊讶为什么“Expires”字段日期指向过去的日期。我完全没有主意了。如果有任何提示,我将不胜感激。也许我需要配置一些东西?

编辑:这是我创建 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;
}

编辑2:我刚刚注意到使用 Jboss 7 时发送到浏览器的 header 格式之间存在差异。不存在 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 应该以某种方式配置来计算 cookies 过期时间。不幸的是我必须使用Wildfly。

最佳答案

我仍然在浪费时间(我今天浪费了 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 转换为 header 的库。如果 maxAgeInSeconds 变量等于 30 天,转换为毫秒 2592000*1000=2592000000 与 MAX_INT (即 2147483647)重叠,因此它的值变为“-1702967296”!!!!

示例:

当前时间:1403460809297 - 1702967296 =(以秒为单位)1401757842

这是:GMT:2014 年 6 月 3 日星期二 01:10:42 GMT

这就是为什么我收到过去的到期日期。这似乎是一种使用 INTeger 而不是更广泛的 Long 类型将 Cookie 对象 Max-Age 属性转换为 Cookie header 的“Expires”属性的机制,意外地设置了过去的 cookie 过期日期。有趣的事实是,该问题适用于 IE,但不适用于 Chrome,例如,Chrome 使用 Max-age 进行内部到期时间计算,忽略 Cookie 中的到期时间。在这种情况下,IE 会忽略 Max-Age 属性值,并采用已计算出的已接收 Cookie 的 Expires 属性值。

关于cookies - "Expires"属性指向过去的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351257/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com