gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:48:46 25 4
gpt4 key购买 nike

如果我在未来使用 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/

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