You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于server.servlet.session.timeout、server.servlet.session.max-age与spring.session.timeout的区别咨询

关于server.servlet.session.timeoutserver.servlet.session.max-agespring.session.timeout的区别咨询

嗨,我来帮你理清楚这三个配置的区别,刚接触Spring Boot会话配置的时候确实容易搞混~下面我逐个拆解,再讲它们的核心差异:

1. 逐个配置的作用详解

server.servlet.session.timeout

  • 这是Servlet容器(比如Tomcat、Jetty)的原生会话超时配置,管的是服务器端HTTP会话的闲置超时时间。比如用户登录后,要是在设定的时间内没发任何请求,容器就会把这个会话标记为过期,用户得重新登录才能访问需要权限的接口。
  • 生效前提:你用的是容器自带的会话管理(也就是没引入Spring Session做分布式会话的场景),或者Spring Session没有接管会话控制权的时候。
  • 格式支持:像30m(30分钟)、1h(1小时)、900s(15分钟)这种时间表达式,默认一般是30分钟。

server.servlet.session.max-age

  • 别和上面的搞混!这个是针对会话Cookie的有效期配置,管的是浏览器端保存的会话Cookie能活多久。比如你设成1d,那这个Cookie在浏览器里会存1天——哪怕用户关掉浏览器,第二天打开只要没到1天,Cookie还在,但能不能用还要看服务器端的会话有没有过期。
  • 不设置的话,默认会话Cookie是“会话级”的:浏览器一关,Cookie直接失效,不管服务器端的会话有没有超时。
  • 重点:它只影响浏览器Cookie的存活时间,服务器端的会话超时还是由另外两个配置(看场景)控制,两者是配合干活的关系。

spring.session.timeout

  • 这个是Spring Session框架专属的配置,只有当你引入了Spring Session(比如用Redis、JDBC做分布式会话共享)的时候才会生效,管的是Spring Session管理的分布式会话的闲置超时时间。
  • 比如你把会话存在Redis里,这个时间就是Redis中会话数据的过期时间。而且当Spring Session接管会话后,原来的server.servlet.session.timeout就会被覆盖,不再生效——毕竟此时会话是由Spring Session统一管理的,容器的原生配置就靠边站了。
  • 格式同样支持30m这类时间表达式。

2. 核心区别与优先级梳理

  • 适用场景泾渭分明
    • 单体应用、不用分布式会话:用server.servlet.session.timeout控服务器端超时,server.servlet.session.max-age控浏览器Cookie有效期。
    • 分布式应用、用Spring Session:spring.session.timeout控分布式会话的服务器端超时,server.servlet.session.max-age依然可以用来控Cookie有效期,server.servlet.session.timeout失效。
  • 优先级规则:当Spring Session接管会话后,spring.session.timeout > server.servlet.session.timeout,容器的原生配置会被Spring Session的配置覆盖。
  • 职责边界清晰:前两个是Servlet容器+浏览器Cookie层面的配置,第三个是分布式会话框架层面的配置。

3. 举个实际例子帮你理解

假设你做了个分布式商城,用Spring Session把会话存在Redis里:

  • 配置spring.session.timeout=1h:用户1小时不操作,Redis里的会话数据就过期,服务器端不认这个会话了。
  • 配置server.servlet.session.max-age=2d:浏览器里的会话Cookie会存2天,哪怕用户关了浏览器,2天内打开浏览器Cookie还在,但如果已经超过1小时没操作,服务器端会话已经过期,用户还是得重新登录。

要是还有不清楚的细节,随时问我哦~

火山引擎 最新活动