在迁移到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 的显式配置将不再受支持。如果类路径上存在多个会话存储的实现,则将选择按顺序固定使用实现。

优先顺序是在网页上写明的。

    1. Redis: Redis 是一个开源的内存数据结构存储系统。

 

    1. JDBC: JDBC 是 Java 数据库连接技术。

 

    1. 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

同样的行为,添加注释后就没效果,这有点难以理解呢。

上述内容

bannerAds