Skip to content

Commit 02e836b

Browse files
committed
Allow Session's repository filter to be configured via the environment
Closes gh-8301
1 parent 80e31e0 commit 02e836b

File tree

4 files changed

+93
-4
lines changed

4 files changed

+93
-4
lines changed

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

+49
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19+
import java.util.Arrays;
20+
import java.util.HashSet;
21+
import java.util.Set;
22+
1923
import org.springframework.beans.factory.ObjectProvider;
2024
import org.springframework.boot.autoconfigure.web.ServerProperties;
2125
import org.springframework.boot.context.properties.ConfigurationProperties;
26+
import org.springframework.session.web.http.SessionRepositoryFilter;
2227

2328
/**
2429
* Configuration properties for Spring Session.
@@ -38,6 +43,8 @@ public class SessionProperties {
3843

3944
private Integer timeout;
4045

46+
private Servlet servlet = new Servlet();
47+
4148
public SessionProperties(ObjectProvider<ServerProperties> serverProperties) {
4249
ServerProperties properties = serverProperties.getIfUnique();
4350
this.timeout = (properties != null ? properties.getSession().getTimeout() : null);
@@ -60,4 +67,46 @@ public Integer getTimeout() {
6067
return this.timeout;
6168
}
6269

70+
public Servlet getServlet() {
71+
return this.servlet;
72+
}
73+
74+
public void setServlet(Servlet servlet) {
75+
this.servlet = servlet;
76+
}
77+
78+
/**
79+
* Servlet-related properties.
80+
*/
81+
public static class Servlet {
82+
83+
/**
84+
* Session repository filter order.
85+
*/
86+
private int filterOrder = SessionRepositoryFilter.DEFAULT_ORDER;
87+
88+
/**
89+
* Session repository filter dispatcher types.
90+
*/
91+
private Set<String> filterDispatcherTypes = new HashSet<>(
92+
Arrays.asList("ASYNC", "ERROR", "REQUEST"));
93+
94+
public int getFilterOrder() {
95+
return this.filterOrder;
96+
}
97+
98+
public void setFilterOrder(int filterOrder) {
99+
this.filterOrder = filterOrder;
100+
}
101+
102+
public Set<String> getFilterDispatcherTypes() {
103+
return this.filterDispatcherTypes;
104+
}
105+
106+
public void setFilterDispatcherTypes(Set<String> filterDispatcherTypes) {
107+
this.filterDispatcherTypes = filterDispatcherTypes;
108+
}
109+
110+
}
111+
63112
}

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

+21-4
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
package org.springframework.boot.autoconfigure.session;
1818

1919
import java.util.EnumSet;
20+
import java.util.Locale;
21+
import java.util.Set;
22+
import java.util.stream.Collectors;
2023

2124
import javax.servlet.DispatcherType;
2225

2326
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
27+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2428
import org.springframework.boot.web.servlet.FilterRegistrationBean;
2529
import org.springframework.context.annotation.Bean;
2630
import org.springframework.context.annotation.Configuration;
@@ -33,17 +37,30 @@
3337
*/
3438
@Configuration
3539
@ConditionalOnBean(SessionRepositoryFilter.class)
40+
@EnableConfigurationProperties(SessionProperties.class)
3641
class SessionRepositoryFilterConfiguration {
3742

3843
@Bean
3944
public FilterRegistrationBean<SessionRepositoryFilter<?>> sessionRepositoryFilterRegistration(
40-
SessionRepositoryFilter<?> filter) {
45+
SessionProperties sessionProperties, SessionRepositoryFilter<?> filter) {
4146
FilterRegistrationBean<SessionRepositoryFilter<?>> registration = new FilterRegistrationBean<>(
4247
filter);
43-
registration.setDispatcherTypes(EnumSet.of(DispatcherType.ASYNC,
44-
DispatcherType.ERROR, DispatcherType.REQUEST));
45-
registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER);
48+
registration.setDispatcherTypes(getDispatcherTypes(sessionProperties));
49+
registration.setOrder(sessionProperties.getServlet().getFilterOrder());
4650
return registration;
4751
}
4852

53+
private EnumSet<DispatcherType> getDispatcherTypes(
54+
SessionProperties sessionProperties) {
55+
Set<String> filterDispatcherTypes = sessionProperties.getServlet()
56+
.getFilterDispatcherTypes();
57+
if (filterDispatcherTypes == null) {
58+
return null;
59+
}
60+
return filterDispatcherTypes.stream()
61+
.map((type) -> type.toUpperCase(Locale.ENGLISH))
62+
.map(DispatcherType::valueOf).collect(Collectors
63+
.collectingAndThen(Collectors.toSet(), EnumSet::copyOf));
64+
}
65+
4966
}

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

+21
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,27 @@ public void filterIsRegisteredWithAsyncErrorAndRequestDispatcherTypes() {
116116
DispatcherType.ERROR, DispatcherType.REQUEST);
117117
}
118118

119+
@Test
120+
public void filterOrderCanBeCustomized() {
121+
load("spring.session.store-type=hash-map",
122+
"spring.session.servlet.filter-order=123");
123+
FilterRegistrationBean<?> registration = this.context
124+
.getBean(FilterRegistrationBean.class);
125+
assertThat(registration.getOrder()).isEqualTo(123);
126+
}
127+
128+
@SuppressWarnings("unchecked")
129+
@Test
130+
public void filterDispatcherTypesCanBeCustomized() {
131+
load("spring.session.store-type=hash-map",
132+
"spring.session.servlet.filter-dispatcher-types=error, request");
133+
FilterRegistrationBean<?> registration = this.context
134+
.getBean(FilterRegistrationBean.class);
135+
assertThat((EnumSet<DispatcherType>) ReflectionTestUtils.getField(registration,
136+
"dispatcherTypes")).containsOnly(DispatcherType.ERROR,
137+
DispatcherType.REQUEST);
138+
}
139+
119140
@Configuration
120141
static class SessionRepositoryConfiguration {
121142

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

+2
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ content into your application; rather pick only the properties that you need.
193193
server.session.cookie.path= # Path of the session cookie.
194194
server.session.cookie.secure= # "Secure" flag for the session cookie.
195195
server.session.persistent=false # Persist session data between restarts.
196+
server.session.servlet.filter-order=-2147483598 # Session repository filter order.
197+
server.session.servlet.filter-dispatcher-types=ASYNC, ERROR, REQUEST # Session repository filter dispatcher types.
196198
server.session.store-dir= # Directory used to store session data.
197199
server.session.timeout= # Session timeout in seconds.
198200
server.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl").

0 commit comments

Comments
 (0)