From 1cd3b0cabe2f4479a07659c560c946eb03423d9e Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 11 Sep 2017 18:16:40 +0200 Subject: [PATCH] Remove auto-configuration for MapSessionRepository This commit removes auto-configuration for Spring Session's simple in memory support. Closes gh-10253 --- .../session/HashMapSessionConfiguration.java | 50 ------------------- .../session/SessionStoreMappings.java | 1 - .../boot/autoconfigure/session/StoreType.java | 5 -- .../SessionAutoConfigurationJdbcTests.java | 11 ++++ .../SessionAutoConfigurationTests.java | 43 ++-------------- .../FilterOrderingIntegrationTests.java | 21 ++++++-- .../main/asciidoc/spring-boot-features.adoc | 1 - 7 files changed, 33 insertions(+), 99 deletions(-) delete mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java deleted file mode 100644 index 28f161ea0f..0000000000 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.autoconfigure.session; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.session.MapSessionRepository; -import org.springframework.session.SessionRepository; -import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; - -/** - * HashMap based session configuration, intended as a fallback. - * - * @author Tommy Ludwig - * @author Stephane Nicoll - * @author Vedran Pavic - */ -@Configuration -@EnableSpringHttpSession -@Conditional(SessionCondition.class) -@ConditionalOnMissingBean(SessionRepository.class) -class HashMapSessionConfiguration { - - @Bean - public MapSessionRepository sessionRepository(SessionProperties properties) { - MapSessionRepository repository = new MapSessionRepository(); - Integer timeout = properties.getTimeout(); - if (timeout != null) { - repository.setDefaultMaxInactiveInterval(timeout); - } - return repository; - } - -} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java index 42eba96096..ee4617f8c2 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java @@ -37,7 +37,6 @@ final class SessionStoreMappings { mappings.put(StoreType.REDIS, RedisSessionConfiguration.class); mappings.put(StoreType.JDBC, JdbcSessionConfiguration.class); mappings.put(StoreType.HAZELCAST, HazelcastSessionConfiguration.class); - mappings.put(StoreType.HASH_MAP, HashMapSessionConfiguration.class); mappings.put(StoreType.NONE, NoOpSessionConfiguration.class); MAPPINGS = Collections.unmodifiableMap(mappings); } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java index b03c8d469e..5ba79625f5 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java @@ -41,11 +41,6 @@ public enum StoreType { */ HAZELCAST, - /** - * Simple in-memory map of sessions. - */ - HASH_MAP, - /** * No session data-store. */ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java index 24c016008d..a20f87b4aa 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java @@ -27,6 +27,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.session.jdbc.JdbcOperationsSessionRepository; @@ -67,6 +68,16 @@ public class SessionAutoConfigurationJdbcTests }); } + @Test + public void filterOrderCanBeCustomized() { + this.contextRunner.withPropertyValues("spring.session.store-type=jdbc", + "spring.session.servlet.filter-order=123").run((context) -> { + FilterRegistrationBean registration = context + .getBean(FilterRegistrationBean.class); + assertThat(registration.getOrder()).isEqualTo(123); + }); + } + @Test public void disableDatabaseInitializer() { this.contextRunner.withPropertyValues( diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java index 9cea6c8eb9..a02b8025ea 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java @@ -25,7 +25,6 @@ import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -92,31 +91,9 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat }); } - @Test - public void hashMapSessionStore() { - this.contextRunner - .withPropertyValues("spring.session.store-type=hash-map") - .run((context) -> { - MapSessionRepository repository = validateSessionRepository(context, - MapSessionRepository.class); - assertThat(getSessionTimeout(repository)).isNull(); - }); - } - - @Test - public void hashMapSessionStoreCustomTimeout() { - this.contextRunner.withUserConfiguration(ServerProperties.class). - withPropertyValues("spring.session.store-type=hash-map", - "server.session.timeout=3000").run((context) -> { - MapSessionRepository repository = validateSessionRepository(context, - MapSessionRepository.class); - assertThat(getSessionTimeout(repository)).isEqualTo(3000); - }); - } - @Test public void springSessionTimeoutIsNotAValidProperty() { - this.contextRunner.withPropertyValues("spring.session.store-type=hash-map", + this.contextRunner.withPropertyValues( "spring.session.timeout=3000").run((context) -> { assertThat(context).hasFailed(); assertThat(context).getFailure().isInstanceOf(BeanCreationException.class); @@ -127,8 +104,8 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat @SuppressWarnings("unchecked") @Test public void filterIsRegisteredWithAsyncErrorAndRequestDispatcherTypes() { - this.contextRunner.withPropertyValues( - "spring.session.store-type=hash-map").run((context) -> { + this.contextRunner.withUserConfiguration( + SessionRepositoryConfiguration.class).run((context) -> { FilterRegistrationBean registration = context .getBean(FilterRegistrationBean.class); assertThat(registration.getFilter()) @@ -139,16 +116,6 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat }); } - @Test - public void filterOrderCanBeCustomized() { - this.contextRunner.withPropertyValues("spring.session.store-type=hash-map", - "spring.session.servlet.filter-order=123").run((context) -> { - FilterRegistrationBean registration = context - .getBean(FilterRegistrationBean.class); - assertThat(registration.getOrder()).isEqualTo(123); - }); - } - @Test public void filterOrderCanBeCustomizedWithCustomStore() { this.contextRunner.withUserConfiguration(SessionRepositoryConfiguration.class) @@ -163,8 +130,8 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat @SuppressWarnings("unchecked") @Test public void filterDispatcherTypesCanBeCustomized() { - this.contextRunner.withPropertyValues("spring.session.store-type=hash-map", - "spring.session.servlet.filter-dispatcher-types=error, request") + this.contextRunner.withUserConfiguration(SessionRepositoryConfiguration.class) + .withPropertyValues("spring.session.servlet.filter-dispatcher-types=error, request") .run((context) -> { FilterRegistrationBean registration = context .getBean(FilterRegistrationBean.class); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/FilterOrderingIntegrationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/FilterOrderingIntegrationTests.java index 37d3578514..d2da3100fb 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/FilterOrderingIntegrationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/FilterOrderingIntegrationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.web.servlet; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import javax.servlet.Filter; @@ -29,7 +30,6 @@ import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoCon import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration; -import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.testsupport.web.servlet.MockServletWebServer.RegisteredFilter; import org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; @@ -40,6 +40,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.security.web.FilterChainProxy; +import org.springframework.session.MapSessionRepository; +import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; import org.springframework.session.web.http.SessionRepositoryFilter; import static org.assertj.core.api.Assertions.assertThat; @@ -84,10 +86,10 @@ public class FilterOrderingIntegrationTests { private void load() { this.context = new AnnotationConfigServletWebServerApplicationContext(); - TestPropertyValues.of("spring.session.store-type=hash-map").applyTo(this.context); this.context.register(MockWebServerConfiguration.class, - TestRedisConfiguration.class, WebMvcAutoConfiguration.class, - SecurityAutoConfiguration.class, SessionAutoConfiguration.class, + TestSessionConfiguration.class, TestRedisConfiguration.class, + WebMvcAutoConfiguration.class, SecurityAutoConfiguration.class, + SessionAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, HttpEncodingAutoConfiguration.class); @@ -109,6 +111,17 @@ public class FilterOrderingIntegrationTests { } + @Configuration + @EnableSpringHttpSession + static class TestSessionConfiguration { + + @Bean + public MapSessionRepository mapSessionRepository() { + return new MapSessionRepository(new ConcurrentHashMap<>()); + } + + } + @Configuration static class TestRedisConfiguration { diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 3b9acde139..189ce2d665 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -5597,7 +5597,6 @@ Spring Boot provides Spring Session auto-configuration for a wide range of store * JDBC * Redis * Hazelcast -* HashMap If Spring Session is available, you must choose the {sc-spring-boot-autoconfigure}/session/StoreType.{sc-ext}[`StoreType`] that you wish to