Browse Source

Polish spring session auto-configuration

This commit improves the initial submission by adding more tests and
more configuration options.

Closes gh-5158
pull/5836/merge
Stephane Nicoll 10 years ago
parent
commit
bf89c8ee46
  1. 15
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java
  2. 36
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HazelcastSessionConfiguration.java
  3. 34
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java
  4. 34
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/MongoSessionConfiguration.java
  5. 4
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/NoOpSessionConfiguration.java
  6. 39
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisSessionConfiguration.java
  7. 19
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java
  8. 8
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java
  9. 139
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java
  10. 4
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java
  11. 2
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java
  12. 76
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/AbstractSessionAutoConfigurationTests.java
  13. 69
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java
  14. 184
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java
  15. 120
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/StoreTypesConfigurationTests.java
  16. 5
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/FilterOrderingIntegrationTests.java
  17. 2
      spring-boot-dependencies/pom.xml
  18. 9
      spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc
  19. 23
      spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc

15
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SimpleSessionConfiguration.java → spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HashMapSessionConfiguration.java

@ -16,7 +16,6 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -26,24 +25,24 @@ import org.springframework.session.SessionRepository;
import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession;
/** /**
* In-memory session configuration, intended as a fallback. * HashMap based session configuration, intended as a fallback.
* *
* @author Tommy Ludwig * @author Tommy Ludwig
* @since 1.4.0 * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@EnableSpringHttpSession @EnableSpringHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class SimpleSessionConfiguration { class HashMapSessionConfiguration {
@Bean @Bean
public SessionRepository<ExpiringSession> sessionRepository(ServerProperties serverProperties) { public SessionRepository<ExpiringSession> sessionRepository(SessionProperties sessionProperties) {
MapSessionRepository sessionRepository = new MapSessionRepository(); MapSessionRepository sessionRepository = new MapSessionRepository();
Integer timeout = sessionProperties.getTimeout();
Integer timeout = serverProperties.getSession().getTimeout(); if (timeout != null) {
if (serverProperties.getSession().getTimeout() != null) {
sessionRepository.setDefaultMaxInactiveInterval(timeout); sessionRepository.setDefaultMaxInactiveInterval(timeout);
} }
return sessionRepository; return sessionRepository;
} }
} }

36
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HazelcastSessionConfiguration.java

@ -16,44 +16,38 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import javax.annotation.PostConstruct;
import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.HazelcastInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.MapSessionRepository; import org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration;
import org.springframework.session.hazelcast.config.annotation.web.http.EnableHazelcastHttpSession;
/** /**
* Hazelcast backed session auto-configuration. * Hazelcast backed session configuration.
* *
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.4.0 * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnBean({ HazelcastInstance.class }) @ConditionalOnBean(HazelcastInstance.class)
@EnableHazelcastHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class HazelcastSessionConfiguration { class HazelcastSessionConfiguration {
private ServerProperties serverProperties; @Configuration
public static class SprigBootHazelcastHttpSessionConfiguration
private MapSessionRepository sessionRepository; extends HazelcastHttpSessionConfiguration {
HazelcastSessionConfiguration(ServerProperties serverProperties, MapSessionRepository sessionRepository) {
this.serverProperties = serverProperties;
this.sessionRepository = sessionRepository;
}
@PostConstruct @Autowired
public void applyConfigurationProperties() { public void customize(SessionProperties sessionProperties) {
Integer timeout = this.serverProperties.getSession().getTimeout(); Integer timeout = sessionProperties.getTimeout();
if (timeout != null) { if (timeout != null) {
this.sessionRepository.setDefaultMaxInactiveInterval(timeout); setMaxInactiveIntervalInSeconds(timeout);
}
setSessionMapName(sessionProperties.getHazelcast().getMapName());
} }
} }
} }

34
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java

@ -16,44 +16,38 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import javax.annotation.PostConstruct;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.jdbc.JdbcOperationsSessionRepository; import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration;
import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession;
/** /**
* JDBC backed session auto-configuration. * JDBC backed session configuration.
* *
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.4.0 * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnBean(DataSource.class) @ConditionalOnBean(DataSource.class)
@EnableJdbcHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class JdbcSessionConfiguration { class JdbcSessionConfiguration {
private ServerProperties serverProperties; @Configuration
public static class SpringBootJdbcHttpSessionConfiguration
private JdbcOperationsSessionRepository sessionRepository; extends JdbcHttpSessionConfiguration {
JdbcSessionConfiguration(ServerProperties serverProperties,
JdbcOperationsSessionRepository sessionRepository) {
this.serverProperties = serverProperties;
this.sessionRepository = sessionRepository;
}
@PostConstruct @Autowired
public void applyConfigurationProperties() { public void customize(SessionProperties sessionProperties) {
Integer timeout = this.serverProperties.getSession().getTimeout(); Integer timeout = sessionProperties.getTimeout();
if (timeout != null) { if (timeout != null) {
this.sessionRepository.setDefaultMaxInactiveInterval(timeout); setMaxInactiveIntervalInSeconds(timeout);
}
setTableName(sessionProperties.getJdbc().getTableName());
} }
} }
} }

34
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/MongoSessionConfiguration.java

@ -16,43 +16,37 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.session.data.mongo.MongoOperationsSessionRepository; import org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;
/** /**
* Mongo backed session auto-configuration. * Mongo backed session configuration.
* *
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.4.0 * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnBean(MongoOperations.class) @ConditionalOnBean(MongoOperations.class)
@EnableMongoHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class MongoSessionConfiguration { class MongoSessionConfiguration {
private ServerProperties serverProperties; @Configuration
public static class SpringBootMongoHttpSessionConfiguration
private MongoOperationsSessionRepository sessionRepository; extends MongoHttpSessionConfiguration {
MongoSessionConfiguration(ServerProperties serverProperties, MongoOperationsSessionRepository sessionRepository) {
this.serverProperties = serverProperties;
this.sessionRepository = sessionRepository;
}
@PostConstruct @Autowired
public void applyConfigurationProperties() { public void customize(SessionProperties sessionProperties) {
Integer timeout = this.serverProperties.getSession().getTimeout(); Integer timeout = sessionProperties.getTimeout();
if (timeout != null) { if (timeout != null) {
this.sessionRepository.setMaxInactiveIntervalInSeconds(timeout); setMaxInactiveIntervalInSeconds(timeout);
}
setCollectionName(sessionProperties.getMongo().getCollectionName());
} }
} }
} }

4
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/NoOpSessionConfiguration.java

@ -22,11 +22,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.session.SessionRepository; import org.springframework.session.SessionRepository;
/** /**
* No-op session configuration used to disable Spring Session auto configuration via the * No-op session configuration used to disable Spring Session using the environment.
* environment.
* *
* @author Tommy Ludwig * @author Tommy Ludwig
* @since 1.4.0
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class) @ConditionalOnMissingBean(SessionRepository.class)

39
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisSessionConfiguration.java

@ -16,45 +16,42 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.data.redis.RedisOperationsSessionRepository; import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/** /**
* Redis backed session auto-configuration. * Redis backed session configuration.
* *
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.4.0 * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnBean({RedisTemplate.class}) @ConditionalOnBean({ RedisTemplate.class, RedisConnectionFactory.class })
@EnableRedisHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class RedisSessionConfiguration { class RedisSessionConfiguration {
private ServerProperties serverProperties; @Configuration
public static class SpringBootRedisHttpSessionConfiguration
private RedisOperationsSessionRepository sessionRepository; extends RedisHttpSessionConfiguration {
RedisSessionConfiguration(ServerProperties serverProperties, RedisOperationsSessionRepository sessionRepository) {
this.serverProperties = serverProperties;
this.sessionRepository = sessionRepository;
}
@PostConstruct @Autowired
public void applyConfigurationProperties() { public void customize(SessionProperties sessionProperties) {
Integer timeout = this.serverProperties.getSession().getTimeout(); Integer timeout = sessionProperties.getTimeout();
if (timeout != null) { if (timeout != null) {
this.sessionRepository.setDefaultMaxInactiveInterval(timeout); setMaxInactiveIntervalInSeconds(timeout);
}
SessionProperties.Redis redis = sessionProperties.getRedis();
setRedisNamespace(redis.getNamespace());
setRedisFlushMode(redis.getFlushMode());
} }
} }
} }

19
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java

@ -21,15 +21,12 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration; import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionConfigurationImportSelector; import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionConfigurationImportSelector;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportSelector; import org.springframework.context.annotation.ImportSelector;
@ -43,7 +40,8 @@ import org.springframework.session.SessionRepository;
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.3.0 * @author Stephane Nicoll
* @since 1.4.0
*/ */
@Configuration @Configuration
@ConditionalOnClass(Session.class) @ConditionalOnClass(Session.class)
@ -55,19 +53,6 @@ import org.springframework.session.SessionRepository;
@Import(SessionConfigurationImportSelector.class) @Import(SessionConfigurationImportSelector.class)
public class SessionAutoConfiguration { public class SessionAutoConfiguration {
@Configuration
@ConditionalOnMissingBean(value = ServerProperties.class, search = SearchStrategy.CURRENT)
// Just in case user switches off ServerPropertiesAutoConfiguration
public static class ServerPropertiesConfiguration {
@Bean
// Use the same bean name as the default one for any old webapp
public ServerProperties serverProperties() {
return new ServerProperties();
}
}
/** /**
* {@link ImportSelector} to add {@link StoreType} configuration classes. * {@link ImportSelector} to add {@link StoreType} configuration classes.
*/ */

8
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java

@ -24,7 +24,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
/** /**
* General condition used by all session auto-configuration classes. * General condition used with all session configuration classes.
* *
* @author Tommy Ludwig * @author Tommy Ludwig
*/ */
@ -34,13 +34,13 @@ class SessionCondition extends SpringBootCondition {
public ConditionOutcome getMatchOutcome(ConditionContext context, public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
context.getEnvironment(), "spring.session.store."); context.getEnvironment(), "spring.session.");
if (!resolver.containsProperty("type")) { if (!resolver.containsProperty("store-type")) {
return ConditionOutcome.match("Automatic session store type"); return ConditionOutcome.match("Automatic session store type");
} }
StoreType sessionStoreType = SessionStoreMappings StoreType sessionStoreType = SessionStoreMappings
.getType(((AnnotationMetadata) metadata).getClassName()); .getType(((AnnotationMetadata) metadata).getClassName());
String value = resolver.getProperty("type").replace("-", "_").toUpperCase(); String value = resolver.getProperty("store-type").replace("-", "_").toUpperCase();
if (value.equals(sessionStoreType.name())) { if (value.equals(sessionStoreType.name())) {
return ConditionOutcome.match("Session store type " + sessionStoreType); return ConditionOutcome.match("Session store type " + sessionStoreType);
} }

139
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java

@ -16,42 +16,153 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.session.data.redis.RedisFlushMode;
/** /**
* Properties for configuring Spring Session's auto-configuration. * Configuration properties for Spring Session.
* *
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Stephane Nicoll
* @since 1.4.0 * @since 1.4.0
*/ */
@ConfigurationProperties("spring.session") @ConfigurationProperties("spring.session")
public class SessionProperties { public class SessionProperties {
private Store store; /**
* Session store type, auto-detected according to the environment by default.
*/
private StoreType storeType;
private Integer timeout;
private final Hazelcast hazelcast = new Hazelcast();
public Store getStore() { private final Jdbc jdbc = new Jdbc();
return this.store;
private final Mongo mongo = new Mongo();
private final Redis redis = new Redis();
public SessionProperties(ObjectProvider<ServerProperties> serverProperties) {
ServerProperties properties = serverProperties.getIfUnique();
this.timeout = (properties != null ? properties.getSession().getTimeout() : null);
} }
public void setStore(Store store) { public StoreType getStoreType() {
this.store = store; return this.storeType;
}
public void setStoreType(StoreType storeType) {
this.storeType = storeType;
} }
/** /**
* Session store-specific properties. * Return the session timeout in seconds.
* @return the session timeout in seconds
* @see ServerProperties#getSession()
*/ */
public static class Store { public Integer getTimeout() {
return this.timeout;
}
public Hazelcast getHazelcast() {
return this.hazelcast;
}
public Jdbc getJdbc() {
return this.jdbc;
}
public Mongo getMongo() {
return this.mongo;
}
public Redis getRedis() {
return this.redis;
}
public static class Hazelcast {
/** /**
* Session data store type, auto-detected according to the environment by default. * Name of the map used to store sessions.
*/ */
private StoreType type; private String mapName = "spring:session:sessions";
public StoreType getType() { public String getMapName() {
return this.type; return this.mapName;
} }
public void setType(StoreType type) { public void setMapName(String mapName) {
this.type = type; this.mapName = mapName;
} }
} }
public static class Jdbc {
/**
* Name of database table used to store sessions.
*/
private String tableName = "SPRING_SESSION";
public String getTableName() {
return this.tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
}
public static class Mongo {
/**
* Collection name used to store sessions.
*/
private String collectionName = "sessions";
public String getCollectionName() {
return this.collectionName;
}
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
}
public static class Redis {
/**
* Namespace for keys used to store sessions.
*/
private String namespace = "";
/**
* Flush mode for the Redis sessions.
*/
private RedisFlushMode flushMode = RedisFlushMode.ON_SAVE;
public String getNamespace() {
return this.namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public RedisFlushMode getFlushMode() {
return this.flushMode;
}
public void setFlushMode(RedisFlushMode flushMode) {
this.flushMode = flushMode;
}
}
} }

4
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java

@ -27,7 +27,6 @@ import org.springframework.util.Assert;
* *
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Eddú Meléndez * @author Eddú Meléndez
* @since 1.4.0
*/ */
final class SessionStoreMappings { final class SessionStoreMappings {
@ -39,7 +38,7 @@ final class SessionStoreMappings {
mappings.put(StoreType.MONGO, MongoSessionConfiguration.class); mappings.put(StoreType.MONGO, MongoSessionConfiguration.class);
mappings.put(StoreType.REDIS, RedisSessionConfiguration.class); mappings.put(StoreType.REDIS, RedisSessionConfiguration.class);
mappings.put(StoreType.HAZELCAST, HazelcastSessionConfiguration.class); mappings.put(StoreType.HAZELCAST, HazelcastSessionConfiguration.class);
mappings.put(StoreType.HASH_MAP, SimpleSessionConfiguration.class); mappings.put(StoreType.HASH_MAP, HashMapSessionConfiguration.class);
mappings.put(StoreType.NONE, NoOpSessionConfiguration.class); mappings.put(StoreType.NONE, NoOpSessionConfiguration.class);
MAPPINGS = Collections.unmodifiableMap(mappings); MAPPINGS = Collections.unmodifiableMap(mappings);
} }
@ -63,4 +62,5 @@ final class SessionStoreMappings {
throw new IllegalStateException( throw new IllegalStateException(
"Unknown configuration class " + configurationClassName); "Unknown configuration class " + configurationClassName);
} }
} }

2
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java

@ -51,7 +51,7 @@ public enum StoreType {
HASH_MAP, HASH_MAP,
/** /**
* No session datastore. * No session data-store.
*/ */
NONE; NONE;

76
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/AbstractSessionAutoConfigurationTests.java

@ -0,0 +1,76 @@
/*
* Copyright 2012-2016 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 java.util.Collection;
import org.junit.After;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.session.SessionRepository;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Share test utilities for {@link SessionAutoConfiguration} tests.
*
* @author Stephane Nicoll
*/
public abstract class AbstractSessionAutoConfigurationTests {
protected AnnotationConfigWebApplicationContext context;
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
protected <T extends SessionRepository<?>> T validateSessionRepository(Class<T> type) {
SessionRepository cacheManager = this.context.getBean(SessionRepository.class);
assertThat(cacheManager).as("Wrong session repository type").isInstanceOf(type);
return type.cast(cacheManager);
}
protected Integer getSessionTimeout(SessionRepository<?> sessionRepository) {
return (Integer) new DirectFieldAccessor(sessionRepository)
.getPropertyValue("defaultMaxInactiveInterval");
}
protected void load(String... environment) {
load(null, environment);
}
protected void load(Collection<Class<?>> configs, String... environment) {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
EnvironmentTestUtils.addEnvironment(ctx, environment);
if (configs != null) {
ctx.register(configs.toArray(new Class<?>[configs.size()]));
}
ctx.register(ServerPropertiesAutoConfiguration.class,
SessionAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
ctx.refresh();
this.context = ctx;
}
}

69
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java

@ -0,0 +1,69 @@
/*
* Copyright 2012-2016 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 java.util.Collections;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.redis.RedisTestServer;
import org.springframework.session.data.redis.RedisFlushMode;
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Redis specific tests for {@link SessionAutoConfiguration}.
*
* @author Stephane Nicoll
*/
public class SessionAutoConfigurationRedisTests
extends AbstractSessionAutoConfigurationTests {
@Rule
public final RedisTestServer redis = new RedisTestServer();
@Test
public void redisSessionStore() {
load(Collections.<Class<?>>singletonList(RedisAutoConfiguration.class),
"spring.session.store-type=redis");
RedisOperationsSessionRepository repository = validateSessionRepository(
RedisOperationsSessionRepository.class);
assertThat(repository.getSessionCreatedChannelPrefix())
.isEqualTo("spring:session:event:created:");
assertThat(new DirectFieldAccessor(repository).getPropertyValue("redisFlushMode"))
.isEqualTo(RedisFlushMode.ON_SAVE);
}
@Test
public void redisSessionStoreWithCustomizations() {
load(Collections.<Class<?>>singletonList(RedisAutoConfiguration.class),
"spring.session.store-type=redis",
"spring.session.redis.namespace=foo",
"spring.session.redis.flush-mode=immediate");
RedisOperationsSessionRepository repository = validateSessionRepository(
RedisOperationsSessionRepository.class);
assertThat(repository.getSessionCreatedChannelPrefix())
.isEqualTo("spring:session:foo:event:created:");
assertThat(new DirectFieldAccessor(repository).getPropertyValue("redisFlushMode"))
.isEqualTo(RedisFlushMode.IMMEDIATE);
}
}

184
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java

@ -16,76 +16,174 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import org.junit.After; import java.util.Arrays;
import org.junit.Rule; import java.util.Collections;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.beans.DirectFieldAccessor;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory;
import org.springframework.boot.redis.RedisTestServer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.ExpiringSession;
import org.springframework.session.MapSessionRepository;
import org.springframework.session.SessionRepository;
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
/** /**
* Tests for {@link SessionAutoConfiguration}. * Tests for {@link SessionAutoConfiguration}.
* *
* @author Dave Syer * @author Dave Syer
* @since 1.3.0 * @author Eddú Meléndez
* @author Stephane Nicoll
*/ */
public class SessionAutoConfigurationTests { public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurationTests {
@Test
public void backOffIfSessionRepositoryIsPresent() {
load(Collections.<Class<?>>singletonList(SessionRepositoryConfiguration.class),
"spring.session.store-type=mongo");
MapSessionRepository repository = validateSessionRepository(
MapSessionRepository.class);
assertThat(this.context.getBean("mySessionRepository")).isSameAs(repository);
}
@Test
public void hashMapSessionStore() {
load("spring.session.store-type=hash-map");
MapSessionRepository repository = validateSessionRepository(
MapSessionRepository.class);
assertThat(getSessionTimeout(repository)).isNull();
}
@Rule @Test
public RedisTestServer redis = new RedisTestServer(); public void hashMapSessionStoreCustomTimeout() {
load("spring.session.store-type=hash-map",
"server.session.timeout=3000");
MapSessionRepository repository = validateSessionRepository(
MapSessionRepository.class);
assertThat(getSessionTimeout(repository)).isEqualTo(3000);
}
private AnnotationConfigEmbeddedWebApplicationContext context; @Test
public void springSessionTimeoutIsNotAValidProperty() {
load("spring.session.store-type=hash-map",
"spring.session.timeout=3000");
MapSessionRepository repository = validateSessionRepository(
MapSessionRepository.class);
assertThat(getSessionTimeout(repository)).isNull();
}
@Test
public void hashMapSessionStoreIsDefault() {
load();
validateSessionRepository(MapSessionRepository.class);
}
@Test
public void jdbcSessionStore() {
load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class),
"spring.session.store-type=jdbc");
JdbcOperationsSessionRepository repository = validateSessionRepository(
JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("SPRING_SESSION");
}
@Test
public void jdbcSessionStoreCustomTableName() {
load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class),
"spring.session.store-type=jdbc",
"spring.session.jdbc.table-name=FOO_BAR");
JdbcOperationsSessionRepository repository = validateSessionRepository(
JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("FOO_BAR");
}
@After @Test
public void close() { public void hazelcastSessionStore() {
if (this.context != null) { load(Collections.<Class<?>>singletonList(HazelcastConfiguration.class),
this.context.close(); "spring.session.store-type=hazelcast");
validateSessionRepository(MapSessionRepository.class);
} }
@Test
public void hazelcastSessionStoreWithCustomizations() {
load(Collections.<Class<?>>singletonList(HazelcastSpecificMap.class),
"spring.session.store-type=hazelcast",
"spring.session.hazelcast.map-name=foo:bar:biz");
validateSessionRepository(MapSessionRepository.class);
HazelcastInstance hazelcastInstance = this.context.getBean(HazelcastInstance.class);
verify(hazelcastInstance, times(1)).getMap("foo:bar:biz");
} }
@Test @Test
public void flat() throws Exception { public void mongoSessionStore() {
this.context = new AnnotationConfigEmbeddedWebApplicationContext(); load(Arrays.asList(EmbeddedMongoAutoConfiguration.class,
this.context.register(Config.class, ServerPropertiesAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class),
RedisAutoConfiguration.class, SessionAutoConfiguration.class, "spring.session.store-type=mongo", "spring.data.mongodb.port=0");
PropertyPlaceholderAutoConfiguration.class); validateSessionRepository(MongoOperationsSessionRepository.class);
this.context.refresh();
ServerProperties server = this.context.getBean(ServerProperties.class);
assertThat(server).isNotNull();
} }
@Test @Test
public void hierarchy() throws Exception { public void mongoSessionStoreWithCustomizations() {
AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(); load(Arrays.asList(EmbeddedMongoAutoConfiguration.class,
parent.register(RedisAutoConfiguration.class, SessionAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class),
PropertyPlaceholderAutoConfiguration.class); "spring.session.store-type=mongo", "spring.data.mongodb.port=0",
parent.refresh(); "spring.session.mongo.collection-name=foobar");
this.context = new AnnotationConfigEmbeddedWebApplicationContext(); MongoOperationsSessionRepository repository = validateSessionRepository(
this.context.setParent(parent); MongoOperationsSessionRepository.class);
this.context.register(Config.class, ServerPropertiesAutoConfiguration.class, assertThat(new DirectFieldAccessor(repository).getPropertyValue("collectionName"))
PropertyPlaceholderAutoConfiguration.class); .isEqualTo("foobar");
this.context.refresh(); }
ServerProperties server = this.context.getBean(ServerProperties.class);
assertThat(server).isNotNull();
@Configuration
static class SessionRepositoryConfiguration {
@Bean
public SessionRepository<?> mySessionRepository() {
return new MapSessionRepository(Collections.<String, ExpiringSession>emptyMap());
}
}
@Configuration
static class HazelcastConfiguration {
@Bean
public HazelcastInstance hazelcastInstance() {
return Hazelcast.newHazelcastInstance();
}
} }
@Configuration @Configuration
protected static class Config { static class HazelcastSpecificMap {
@Bean @Bean
public EmbeddedServletContainerFactory containerFactory() { public HazelcastInstance hazelcastInstance() {
return new MockEmbeddedServletContainerFactory(); IMap map = mock(IMap.class);
HazelcastInstance mock = mock(HazelcastInstance.class);
given(mock.getMap("foo:bar:biz")).willReturn(map);
return mock;
} }
} }

120
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/StoreTypesConfigurationTests.java

@ -1,120 +0,0 @@
/*
* Copyright 2012-2016 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 java.net.UnknownHostException;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.mongodb.MongoClient;
import org.junit.After;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.MapSessionRepository;
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
public class StoreTypesConfigurationTests {
private AnnotationConfigWebApplicationContext context;
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test
public void hashMapSessionStore() {
load("spring.session.store.type=hash-map");
MapSessionRepository sessionRepository = this.context.getBean(MapSessionRepository.class);
assertThat(sessionRepository).isNotNull();
}
@Test
public void jdbcSessionStore() {
load(new String[] {"spring.session.store.type=jdbc"}, EmbeddedDataSourceConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class);
assertThat(this.context.getBean(JdbcOperationsSessionRepository.class)).isNotNull();
}
@Test
public void hazelcastSessionStore() {
load(new String[] {"spring.session.store.type=hazelcast"}, MockHazelcastInstanceConfiguration.class);
assertThat(this.context.getBean(MapSessionRepository.class)).isNotNull();
}
@Test
public void mongoSessionStore() {
load(new String[] {"spring.session.store.type=mongo", "spring.data.mongodb.port=0"}, MockMongoConfiguration.class, MongoDataAutoConfiguration.class, EmbeddedMongoAutoConfiguration.class);
assertThat(this.context.getBean(MongoOperationsSessionRepository.class)).isNotNull();
}
private void load(String storeType) {
load(new String[] {storeType}, null);
}
private void load(String[] storeType, Class<?>... config) {
this.context = new AnnotationConfigWebApplicationContext();
for (String property : storeType) {
EnvironmentTestUtils.addEnvironment(this.context, storeType);
}
if (config != null) {
this.context.register(config);
}
this.context.register(ServerPropertiesAutoConfiguration.class,
SessionAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
}
@Configuration
static class MockHazelcastInstanceConfiguration {
@Bean
public HazelcastInstance hazelcastInstance() {
return Hazelcast.newHazelcastInstance();
}
}
@Configuration
static class MockMongoConfiguration {
@Bean
public MongoClient mongoClient(@Value("${local.mongo.port}") int port)
throws UnknownHostException {
return new MongoClient("localhost", port);
}
}
}

5
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/FilterOrderingIntegrationTests.java

@ -32,9 +32,9 @@ import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebAppl
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor;
import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory.RegisteredFilter; import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory.RegisteredFilter;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.boot.web.filter.OrderedCharacterEncodingFilter; import org.springframework.boot.web.filter.OrderedCharacterEncodingFilter;
import org.springframework.boot.web.filter.OrderedRequestContextFilter; import org.springframework.boot.web.filter.OrderedRequestContextFilter;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnection;
@ -84,9 +84,10 @@ public class FilterOrderingIntegrationTests {
private void load() { private void load() {
this.context = new AnnotationConfigEmbeddedWebApplicationContext(); this.context = new AnnotationConfigEmbeddedWebApplicationContext();
EnvironmentTestUtils.addEnvironment(this.context, "spring.session.store.type=hash-map"); EnvironmentTestUtils.addEnvironment(this.context, "spring.session.store-type=hash-map");
this.context.register(MockEmbeddedServletContainerConfiguration.class, this.context.register(MockEmbeddedServletContainerConfiguration.class,
TestRedisConfiguration.class, WebMvcAutoConfiguration.class, TestRedisConfiguration.class, WebMvcAutoConfiguration.class,
ServerPropertiesAutoConfiguration.class,
SecurityAutoConfiguration.class, SessionAutoConfiguration.class, SecurityAutoConfiguration.class, SessionAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class,

2
spring-boot-dependencies/pom.xml

@ -157,7 +157,7 @@
<spring-security.version>4.0.4.RELEASE</spring-security.version> <spring-security.version>4.0.4.RELEASE</spring-security.version>
<spring-security-jwt.version>1.0.4.RELEASE</spring-security-jwt.version> <spring-security-jwt.version>1.0.4.RELEASE</spring-security-jwt.version>
<spring-security-oauth.version>2.0.9.RELEASE</spring-security-oauth.version> <spring-security-oauth.version>2.0.9.RELEASE</spring-security-oauth.version>
<spring-session.version>1.2.0.RC2</spring-session.version> <spring-session.version>1.2.0.RC3</spring-session.version>
<spring-social.version>1.1.4.RELEASE</spring-social.version> <spring-social.version>1.1.4.RELEASE</spring-social.version>
<spring-social-facebook.version>2.0.3.RELEASE</spring-social-facebook.version> <spring-social-facebook.version>2.0.3.RELEASE</spring-social-facebook.version>
<spring-social-linkedin.version>1.0.2.RELEASE</spring-social-linkedin.version> <spring-social-linkedin.version>1.0.2.RELEASE</spring-social-linkedin.version>

9
spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

@ -356,8 +356,13 @@ content into your application; rather pick only the properties that you need.
spring.resources.chain.strategy.fixed.version= # Version string to use for the Version Strategy. spring.resources.chain.strategy.fixed.version= # Version string to use for the Version Strategy.
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources. spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources.
# SPRING SESSION ({sc-spring-boot-autoconfigure}/session/SocialWebAutoConfiguration.{sc-ext}[SessionAutoConfiguration]) # SPRING SESSION ({sc-spring-boot-autoconfigure}/session/SessionProperties.{sc-ext}[SessionProperties])
spring.session.store.store-type= # Session store type spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions.
spring.session.jdbc.table-name=SPRING_SESSION # Name of database table used to store sessions.
spring.session.mongo.collection-name=sessions # Collection name used to store sessions.
spring.session.redis.flush-mode= # Flush mode for the Redis sessions.
spring.session.redis.namespace= # Namespace for keys used to store sessions.
spring.session.store-type= # Session store type, auto-detected according to the environment by default.
# SPRING SOCIAL ({sc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{sc-ext}[SocialWebAutoConfiguration]) # SPRING SOCIAL ({sc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{sc-ext}[SocialWebAutoConfiguration])
spring.social.auto-connection-views=false # Enable the connection status view for supported providers. spring.social.auto-connection-views=false # Enable the connection status view for supported providers.

23
spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc

@ -4392,21 +4392,24 @@ class for more details.
[[boot-features-session]] [[boot-features-session]]
== Spring Session == Spring Session
Spring Session provides support for managing a user's session information. If you are Spring Boot provides Spring Session auto-configuration for a wide range of stores. If
writing a web application and Spring Session and one the following providers: Spring Session is available and you haven't defined a bean of type `SessionRepository`,
Spring Boot tries to detect the following session stores (in this order):
* JDBC * JDBC
* MongoDB
* Redis
* Hazelcast * Hazelcast
* Spring Data Mongo * HashMap
* Spring Data Redis
on the classpath, Spring Boot will auto-configure Spring Session through its It is also possible to _force_ the store to use via the `spring.session.store-type`
`@EnableJdbcHttpSession`, `@EnableHazelcastHttpSession`, `@EnableMongoHttpSession`, property. Each store have specific additional settings. For instance it is possible
`@EnableRedisHttpSession`. Session data will be stored in the provider and the session timeout to customize the name of the table for the jdbc store:
can be configured using the `server.session.timeout` property.
It is also possible to _force_ the session provider to use via the `spring.session.store.type` [source,properties,indent=0]
property. ----
spring.session.jdbc.table-name=SESSIONS
----

Loading…
Cancel
Save