7

如果我在将来设置一个带有 setMaxAge() 的 cookie,当我在后续请求中将 cookie 读回内存时,getMaxAge() 会给我一个 -1。我已经通过 Chrome 的设置和检查器检查了实际的 cookie,我可以验证过期日期确实设置为 60 天后。

static public void setHttpCookie(HttpServletResponse response, String payload) {
    Cookie c = new Cookie(COOKIE_NAME, payload);
    c.setMaxAge(60*86400); // expire sixty days in the future
    c.setPath("/"); // this cookie is good everywhere on the site
    response.addCookie(c);
}

static public String checkForCookie(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if ( cookies != null ) {
        for ( Cookie c : cookies ) {
            if ( COOKIE_NAME.equals(c.getName()) ) {
                int maxAge = c.getMaxAge();
                logger.debug("Read back cookie and it had maxAge of {}.", maxAge);
                String payload = c.getValue();
                return payload;
            }
        }
    }
    return null;
}

为什么 c.getMaxAge() 总是返回 -1?

4

1 回答 1

15

浏览器不会发送回路径和年龄等 cookie 属性。它只发回名称和值。如果最大年龄已过期,则浏览器无论如何都不会发送 cookie。如果路径没有被请求 URI 覆盖,那么浏览器无论如何都不会发送 cookie。

如果您确实需要在设置 cookie确定 cookie 的年龄,那么您应该在设置 cookie 时自己记住它,例如在与登录用户和 cookie 名称相关联的数据库表中, 例如。

此问题与 Java/Servlet 无关。这就是指定 HTTP cookie 的方式。在其他 Web 编程语言中,您会遇到完全相同的问题。另请参阅维基百科的以下摘录(重点是我的)。

Cookie 属性

除了名称-值对,服务器还可以设置这些 cookie 属性:cookie 域、路径、过期时间或最长期限、安全标志和 HttpOnly 标志。浏览器不会将 cookie 属性发送回服务器。他们只会发送 cookie 的名称-值对。浏览器使用 Cookie 属性来确定何时删除 cookie、阻止 cookie 或是否向服务器发送 cookie(名称-值对)。

您可以做的最好的事情是每次在登录期间增加 cookie 的最大年龄。您可以通过再次设置完全相同的 cookie(尤其是完全相同的域/路径/名称)轻松实现此目的。它将覆盖现有的 cookie。这通常在所谓的“记住我”cookie 上以这种方式完成。

于 2013-01-18T03:05:17.507 回答