diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/web/spring-session.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/web/spring-session.adoc index 12326cf0df7..04f8530679f 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/web/spring-session.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/web/spring-session.adoc @@ -27,6 +27,7 @@ spring: For setting the timeout of the session you can use the configprop:spring.session.timeout[] property. If that property is not set with a servlet web application, the auto-configuration falls back to the value of configprop:server.servlet.session.timeout[]. +To provide the timeout programmatically, define a javadoc:org.springframework.boot.session.autoconfigure.SessionTimeout[] bean. You can take control over Spring Session's configuration using `@Enable*HttpSession` (servlet) or `@EnableRedisWebSession` (reactive). This will cause the auto-configuration to back off. diff --git a/module/spring-boot-session-data-redis/src/dockerTest/java/org/springframework/boot/session/data/redis/autoconfigure/SessionDataRedisAutoConfigurationTests.java b/module/spring-boot-session-data-redis/src/dockerTest/java/org/springframework/boot/session/data/redis/autoconfigure/SessionDataRedisAutoConfigurationTests.java index 4d895344b49..3420f5ecc15 100644 --- a/module/spring-boot-session-data-redis/src/dockerTest/java/org/springframework/boot/session/data/redis/autoconfigure/SessionDataRedisAutoConfigurationTests.java +++ b/module/spring-boot-session-data-redis/src/dockerTest/java/org/springframework/boot/session/data/redis/autoconfigure/SessionDataRedisAutoConfigurationTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.context.properties.source.InvalidConfigurationPr import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.boot.session.autoconfigure.AbstractSessionAutoConfigurationTests; import org.springframework.boot.session.autoconfigure.SessionAutoConfiguration; +import org.springframework.boot.session.autoconfigure.SessionTimeout; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; @@ -104,6 +105,17 @@ class SessionDataRedisAutoConfigurationTests extends AbstractSessionAutoConfigur }); } + @Test + void defaultConfigWithCustomSessionTimeoutBean() { + this.contextRunner.withBean(SessionTimeout.class, () -> () -> Duration.ofSeconds(4)) + .withPropertyValues("spring.data.redis.host=" + redis.getHost(), + "spring.data.redis.port=" + redis.getFirstMappedPort(), "spring.session.timeout=1m") + .run((context) -> { + RedisSessionRepository repository = validateSessionRepository(context, RedisSessionRepository.class); + assertThat(repository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval", Duration.ofSeconds(4)); + }); + } + @Test void defaultRedisSessionStoreWithCustomizations() { this.contextRunner diff --git a/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionAutoConfigurationTests.java b/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionAutoConfigurationTests.java index 5a6759b5b1a..ae3458a1a40 100644 --- a/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionAutoConfigurationTests.java +++ b/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionAutoConfigurationTests.java @@ -34,6 +34,7 @@ import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.liquibase.autoconfigure.LiquibaseAutoConfiguration; import org.springframework.boot.session.autoconfigure.AbstractSessionAutoConfigurationTests; import org.springframework.boot.session.autoconfigure.SessionAutoConfiguration; +import org.springframework.boot.session.autoconfigure.SessionTimeout; import org.springframework.boot.sql.init.DatabaseInitializationMode; import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; @@ -108,6 +109,17 @@ class JdbcSessionAutoConfigurationTests extends AbstractSessionAutoConfiguration }); } + @Test + void customSessionTimeoutBean() { + this.contextRunner.withBean(SessionTimeout.class, () -> () -> Duration.ofSeconds(4)) + .withPropertyValues("spring.session.timeout=1m") + .run((context) -> { + JdbcIndexedSessionRepository repository = validateSessionRepository(context, + JdbcIndexedSessionRepository.class); + assertThat(repository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval", Duration.ofSeconds(4)); + }); + } + @Test void customTableName() { this.contextRunner.withPropertyValues("spring.session.jdbc.table-name=FOO_BAR",