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

bro*_*eib 6 java cookies servlets http

如果我在将来设置一个带有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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 12

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

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

此问题与Java/Servlet无关.这就是HTTP cookie的指定方式.您在其他Web编程语言中遇到了完全相同的问题.另见维基百科的以下摘录(强调我的).

Cookie属性

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