Skip to content

Commit 242ac52

Browse files
committed
Add auto-config for Spring Session cookie serializer
This commit adds support for auto-configuring Spring Session's `DefaultCookieSerializer` using `ServerProperties`.
1 parent 671bff2 commit 242ac52

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@
3535
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
3636
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryConfiguration;
3737
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryValidator;
38+
import org.springframework.boot.autoconfigure.web.ServerProperties;
3839
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3940
import org.springframework.context.ApplicationContext;
41+
import org.springframework.context.annotation.Bean;
4042
import org.springframework.context.annotation.Configuration;
4143
import org.springframework.context.annotation.Import;
4244
import org.springframework.context.annotation.ImportSelector;
4345
import org.springframework.core.type.AnnotationMetadata;
4446
import org.springframework.session.Session;
4547
import org.springframework.session.SessionRepository;
48+
import org.springframework.session.web.http.CookieSerializer;
49+
import org.springframework.session.web.http.DefaultCookieSerializer;
50+
import org.springframework.session.web.http.HttpSessionStrategy;
4651

4752
/**
4853
* {@link EnableAutoConfiguration Auto-configuration} for Spring Session.
@@ -57,14 +62,47 @@
5762
@Configuration
5863
@ConditionalOnClass(Session.class)
5964
@ConditionalOnWebApplication(type = Type.SERVLET)
60-
@EnableConfigurationProperties(SessionProperties.class)
65+
@EnableConfigurationProperties({ ServerProperties.class, SessionProperties.class })
6166
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class,
6267
JdbcTemplateAutoConfiguration.class, MongoAutoConfiguration.class,
6368
RedisAutoConfiguration.class })
6469
@Import({ SessionRepositoryConfiguration.class, SessionRepositoryValidator.class,
6570
SessionRepositoryFilterConfiguration.class })
6671
public class SessionAutoConfiguration {
6772

73+
private final ServerProperties serverProperties;
74+
75+
public SessionAutoConfiguration(ServerProperties serverProperties) {
76+
this.serverProperties = serverProperties;
77+
}
78+
79+
@Bean
80+
@ConditionalOnMissingBean({ CookieSerializer.class, HttpSessionStrategy.class })
81+
public DefaultCookieSerializer cookieSerializer() {
82+
ServerProperties.Session.Cookie cookie = this.serverProperties.getSession()
83+
.getCookie();
84+
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
85+
if (cookie.getName() != null) {
86+
cookieSerializer.setCookieName(cookie.getName());
87+
}
88+
if (cookie.getDomain() != null) {
89+
cookieSerializer.setDomainName(cookie.getDomain());
90+
}
91+
if (cookie.getPath() != null) {
92+
cookieSerializer.setCookiePath(cookie.getPath());
93+
}
94+
if (cookie.getHttpOnly() != null) {
95+
cookieSerializer.setUseHttpOnlyCookie(cookie.getHttpOnly());
96+
}
97+
if (cookie.getSecure() != null) {
98+
cookieSerializer.setUseSecureCookie(cookie.getSecure());
99+
}
100+
if (cookie.getMaxAge() != null) {
101+
cookieSerializer.setCookieMaxAge(cookie.getMaxAge());
102+
}
103+
return cookieSerializer;
104+
}
105+
68106
@Configuration
69107
@ConditionalOnMissingBean(SessionRepository.class)
70108
@Import({ SessionRepositoryImplementationValidator.class,

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.springframework.session.MapSessionRepository;
3333
import org.springframework.session.SessionRepository;
3434
import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession;
35+
import org.springframework.session.web.http.DefaultCookieSerializer;
36+
import org.springframework.session.web.http.HeaderHttpSessionStrategy;
3537
import org.springframework.session.web.http.SessionRepositoryFilter;
3638
import org.springframework.test.util.ReflectionTestUtils;
3739

@@ -147,6 +149,39 @@ public void filterDispatcherTypesCanBeCustomized() {
147149
});
148150
}
149151

152+
@Test
153+
public void autoConfiguredCookieSerializerConfiguration() {
154+
this.contextRunner.withUserConfiguration(SessionRepositoryConfiguration.class)
155+
.withPropertyValues("server.session.cookie.name=sid").run((context) -> {
156+
DefaultCookieSerializer cookieSerializer = context
157+
.getBean(DefaultCookieSerializer.class);
158+
assertThat(
159+
ReflectionTestUtils.getField(cookieSerializer, "cookieName"))
160+
.isEqualTo("sid");
161+
});
162+
}
163+
164+
@Test
165+
public void userProvidedCookieSerializerConfiguration() {
166+
this.contextRunner
167+
.withUserConfiguration(UserProvidedCookieSerializerConfiguration.class)
168+
.withPropertyValues("server.session.cookie.name=sid").run((context) -> {
169+
DefaultCookieSerializer cookieSerializer = context
170+
.getBean(DefaultCookieSerializer.class);
171+
assertThat(
172+
ReflectionTestUtils.getField(cookieSerializer, "cookieName"))
173+
.isEqualTo("SESSION");
174+
});
175+
}
176+
177+
@Test
178+
public void userProvidedHttpSessionStrategyConfiguration() {
179+
this.contextRunner
180+
.withUserConfiguration(UserProvidedHttpSessionStrategyConfiguration.class)
181+
.run((context) -> assertThat(
182+
context.getBeansOfType(DefaultCookieSerializer.class)).isEmpty());
183+
}
184+
150185
@Configuration
151186
@EnableSpringHttpSession
152187
static class SessionRepositoryConfiguration {
@@ -158,4 +193,28 @@ public MapSessionRepository mySessionRepository() {
158193

159194
}
160195

196+
@Configuration
197+
@EnableSpringHttpSession
198+
static class UserProvidedCookieSerializerConfiguration
199+
extends SessionRepositoryConfiguration {
200+
201+
@Bean
202+
public DefaultCookieSerializer myCookieSerializer() {
203+
return new DefaultCookieSerializer();
204+
}
205+
206+
}
207+
208+
@Configuration
209+
@EnableSpringHttpSession
210+
static class UserProvidedHttpSessionStrategyConfiguration
211+
extends SessionRepositoryConfiguration {
212+
213+
@Bean
214+
public HeaderHttpSessionStrategy httpSessionStrategy() {
215+
return new HeaderHttpSessionStrategy();
216+
}
217+
218+
}
219+
161220
}

0 commit comments

Comments
 (0)