在迁移到Spring Boot 3.x时,我在会话方面遇到了困难
在迁移到Spring Boot 3.x时,遇到了与会话相关的困难。
这只是一个小故事,所以只需记录在Spring Boot 2.x -> 3.x迁移过程中,我在会话方面遇到的问题。
Spring Boot 3.x 的改变
这里有我的迁移指南。
Spring Boot 3.0迁移指南 · spring-projects/spring-boot Wiki
据官方消息,对于 spring.session.store-type 的显式配置将不再受支持。如果类路径上存在多个会话存储的实现,则将选择按顺序固定使用实现。
优先顺序是在网页上写明的。
-
- Redis: Redis 是一个开源的内存数据结构存储系统。
-
- JDBC: JDBC 是 Java 数据库连接技术。
-
- Hazlecast: Hazlecast 是一个开源的基于 Java 的分布式内存数据网格。
- MongoDB: MongoDB 是一个开源的文档数据库。
已成为。
除此以外,您还可以明确指定诸如@EnableRedisHttpSession等注解的方法。
这次 Sprint Boot 2.x 的配置中,有以下内容,所以我直接指定了 @EnableRedisHttpSession。
spring.session.store-type=redis
无法进行外部配置更改
在默认情况下,会话的有效期限通常为1800秒;然而,我希望更改这个值,所以我设置了spring.session.timeout,但似乎没有生效。我也尝试了其他选项,如server.servlet.session.timeout,但同样没有成功。
在application.yml中进行以下设置,同时指定@EnableRedisHttpSession。
spring:
session:
timeout: 180s
我将尝试编写代码来获取会话的有效时间。
@GetMapping("/s1")
public Map<String, Object> s1(HttpSession session) {
session.setAttribute("test", "value");
return Map.of(
"id", session.getId(),
"date", (new Date()).toString(),
"maxInactiveInterval", session.getMaxInactiveInterval());
}
我将使用curl进行访问,但始终返回1800。
$ curl -s http://localhost:8080/s1 | jq
{
"date": "Wed Oct 04 11:41:29 JST 2023",
"id": "e543ea6d-8141-4ad3-8c6f-15bbae3cc7ad",
"maxInactiveInterval": 1800
}
去掉@EnableRedisHttpSession后,spring.session.timeout开始起作用。
curl -s http://localhost:8080/s1 | jq
{
"date": "Wed Oct 04 11:43:44 JST 2023",
"id": "a14b4f19-e196-4798-a75b-c35a609be146",
"maxInactiveInterval": 180
因为只有Redis的实现被通过到类路径中,所以无论明确地指定注解还是不指定注解,都会有相同的行为。然而,如果明确地指定注解,似乎会导致spring.session.timeout失效。
如果想要指定@EnableRedisHttpSession,请在注解中指定参数。(由于不知道如何将值变为可变,所以固定了一个值)
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 360)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
通过使用`curl`进行访问,返回了360。
curl -s http://localhost:8080/s1 | jq
{
"maxInactiveInterval": 360,
"id": "7c336543-51a7-4d2c-b2cd-4da747fa4986",
"date": "Wed Oct 04 11:50:17 JST 2023"
}
总结
后来搜索了一下,似乎这是一个很常见的故事。有以下类似的文章。
- @EnableRedisHttpSession + Spring Boot ignoring server.session.timeout on application.yml – Stack Overflow
同样的行为,添加注释后就没效果,这有点难以理解呢。
上述内容