在Java servlet中,cookie.getMaxAge()总是返回-1

问题描述 投票:0回答:1
如果我在未来使用 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?

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

如果您确实需要在设置 Cookie 后

确定 Cookie 的年龄,那么您应该在设置 Cookie 时自己在其他地方记住它,例如在与登录用户关联的数据库表中和 cookie 名称,例如。 这个问题与Java/Servlet无关。这就是 HTTP cookie 的指定方式。在其他网络编程语言中你也会遇到完全相同的问题。另请参阅以下来自

维基百科

的摘录(重点是我的)。

Cookie 属性

除了名称-值对之外,服务器还可以设置这些 cookie 属性:cookie 域、路径、过期时间或最大期限、安全标志和 HttpOnly 标志。

浏览器不会将 cookie 属性发送回服务器。他们只会发送 cookie 的名称-值对

。浏览器使用 Cookie 属性来确定何时删除 Cookie、阻止 Cookie 或是否向服务器发送 Cookie(名称-值对)。

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

© www.soinside.com 2019 - 2024. All rights reserved.