tomcat 10 的 context.xml 不支持直接配置 cookie max-age,仅能通过 间接设置会话 cookie(如 jsessionid)的 maxage、httponly、secure 等属性;手动创建的 cookie 必须在代码中调用 setmaxage() 设置有效期。

Tomcat 10 的 context.xml 文件本身**不直接支持配置 Cookie 的有效期(max-age)**。有效期是 Cookie 的客户端行为属性,需通过 Servlet 容器的会话 Cookie 配置(即 <session-cookie></session-cookie> 子元素)间接控制,且仅对容器自动生成的会话 Cookie(如 JSESSIONID)生效。
Session Cookie 的 max-age 控制方式
在 context.xml 中,可通过 <sessioncookie></sessioncookie> 标签设置会话 Cookie 的生命周期参数。Tomcat 10 支持以下关键属性:
-
maxAge:单位为秒,指定 Cookie 在浏览器中保留的时长;设为
-1表示会话级 Cookie(浏览器关闭即失效),设为正整数(如604800)表示 7 天有效期 -
httpOnly:建议设为
true,防止 XSS 读取 Cookie -
secure:设为
true时,仅在 HTTPS 请求中发送(注意:需配合反向代理正确传递X-Forwarded-Proto头) -
path:通常设为
/,确保整个应用路径下均可访问该 Cookie
示例配置(放在 META-INF/context.xml 或全局 conf/context.xml 的 <context></context> 内):
注意:这个配置只影响新创建的会话 Cookie
修改 maxAge 后,已有浏览器中已存在的 JSESSIONID Cookie 不会自动更新。必须满足以下条件才能生效:
- 用户使用新会话(如清空浏览器 Cookie、使用无痕窗口,或原会话已过期)
- 服务端调用
request.getSession(true)创建新会话时,Tomcat 才会按此配置生成并写入响应头 - 前端请求需携带凭证(如
credentials: 'include'),否则 Cookie 不会被发送
自定义业务 Cookie 的有效期不能靠 context.xml
如果你在代码中手动创建 Cookie(如 new Cookie("token", "abc")),其有效期必须在 Java 代码中显式设置:
cookie.setMaxAge(60 * 60 * 24); // 24 小时cookie.setPath("/");cookie.setHttpOnly(true);cookie.setSecure(true);- 最后调用
response.addCookie(cookie)
context.xml 对这类手动 Cookie 完全无影响。
常见误区提醒
不要混淆以下概念:
-
<session-config><session-timeout></session-timeout></session-config>(web.xml 中):控制服务端 Session 对象存活分钟数,和 Cookie 的maxAge无关 -
maxAge = -1≠ 立即失效,而是“会话级”,依赖浏览器进程生命周期 - 设了
secure="true"却仍看到 HTTP 下 Cookie 被发送?大概率是反向代理未配置RemoteIpValve,导致 Tomcat 误判协议为 HTTP











