设置Cookie的maxAge与comment后,为何获取时maxAge为-1且comment为null?
我尝试创建Cookie并设置其maxAge,使用setComment和setMaxAge方法进行配置,代码如下:
HttpSession browserSession = httpRequest.getSession(); Cookie cookie = new Cookie("SESSION", browserSession.getId()); cookie.setComment("test"); cookie.setMaxAge(Integer.MAX_VALUE); httpResponse.addCookie(cookie);但当我从Request中获取Cookie并调试时,发现comment为null,maxAge为-1,我设置的Cookie名称为SESSION,请问这是为什么?
首先,咱们拆解一下你遇到的两个问题:comment为null和maxAge为-1,这两个情况的原因其实不太一样,咱们一个个说:
1. 为什么Cookie的comment是null?
这是HTTP Cookie规范的正常行为——浏览器只会在请求中携带Cookie的name、value、domain、path、secure、httponly这些核心属性,不会把comment回传给服务器。setComment()设置的注释信息,只是给浏览器端(或者用户查看Cookie时)做说明用的,服务器设置后,浏览器存储但不会在后续请求中带回,所以你从HttpServletRequest里拿到的Cookie自然没有comment值,这不是代码问题,是规范要求。
2. 为什么maxAge显示为-1?
这里大概率是两种情况之一:
- 你在设置Cookie的同一次请求里就去获取它了:Cookie是通过响应头
Set-Cookie发送给浏览器的,浏览器要等到下一次向服务器发起请求时,才会把这个Cookie携带回来。如果是在设置Cookie的同一个请求周期里(比如同一个Servlet方法中)直接从httpRequest.getCookies()获取,拿到的是浏览器在请求这个Servlet时就已经带过来的旧Cookie(或者根本没有,此时容器可能会生成默认的会话Cookie,maxAge为-1),而不是你刚设置的那个。 - 代码中有其他地方覆盖了这个Cookie:检查一下你的代码逻辑,有没有在设置这个Cookie之后,又创建了同名的
SESSIONCookie并添加到响应中?如果后面的代码覆盖了之前的设置,那最终发给浏览器的就是后设置的那个,可能它的maxAge是默认的-1。
额外提醒:关于Cookie名称SESSION
有些Web容器(比如Tomcat)默认会生成名为JSESSIONID的Cookie来跟踪会话,你自定义的SESSION Cookie本身没问题,但可以检查下容器的配置或项目中的过滤器,有没有对Cookie做特殊处理,不过这和你当前遇到的comment、maxAge问题关联不大。
验证建议
- 打开浏览器的开发者工具(比如Chrome的「Application」标签),查看存储的Cookie,确认
SESSIONCookie的maxAge和注释是否正确被浏览器接收了。如果浏览器里能看到正确的设置,那服务器端获取时comment为null是正常的,maxAge的问题就去排查是不是同请求获取或者代码覆盖的问题。 - 发起一次新的请求(比如刷新页面),再从Request中获取Cookie,看看maxAge是否正常。
内容的提问来源于stack exchange,提问作者Reva
相关产品推荐
相关产品推荐

