java - 在 Java servlet 中,cookie.getMaxAge() 始终返回 -1

标签 java http servlets cookies

如果我在未来使用 setMaxAge() 设置 cookie,当我在后续请求中将 cookie 读回内存时,getMaxAge() 会返回 -1。我已经通过 Chrome 的设置和检查器检查了实际的 cookie,并且我可以验证过期日期确实设置为 future 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?

最佳答案

浏览器不会发送 Cookie 属性,例如路径和年龄。它仅发送回名称和值。如果最大期限已过期,则浏览器无论如何都不会发送 cookie。如果请求 URI 未覆盖该路径,则浏览器无论如何都不会发送 cookie。

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

此问题与 Java/Servlet 无关。这就是 HTTP cookie 的指定方式。在其他网络编程语言中你也会遇到完全相同的问题。另请参阅 Wikipedia 的以下摘录(强调我的)。

Cookie attributes

Besides the name–value pair, servers can also set these cookie attributes: a cookie domain, a path, expiration time or maximum age, Secure flag and HttpOnly flag. Browsers will not send cookie attributes back to the server. They will only send the cookie’s name-value pair. Cookie attributes are used by browsers to determine when to delete a cookie, block a cookie or whether to send a cookie (name-value pair) to the servers.

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

关于java - 在 Java servlet 中,cookie.getMaxAge() 始终返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464331/

相关文章:

java - @Transactional 和@TransactionAttribute 的区别

java - sql表结构来存储html选择数据

java - 如何使用Map访问servlet中的httpRequest数据?

c - 在 C 中解析日期 Http header 的简单方法是什么?

angular - 如何在请求期间显示微调器?

java - 如果我 setMaxAge(-1),持久跟踪器 cookie 是否会变成 session cookie

java - 此 URL 不支持 HTTP 方法 GET

java - 在JSP上使用超链接显示关系数据库记录的数据库

java - 如何在eclipse的运行配置中获取 "run as java application"作为快捷方式

c++ - C++ 中的同步 HTTP 请求