Skip to content

Commit a49e805

Browse files
committed
Allow to configure custom SessionRepositoryFilter
Signed-off-by: Yanming Zhou <[email protected]>
1 parent 5ce1ffd commit a49e805

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

spring-session-core/src/main/java/org/springframework/session/config/annotation/web/http/EnableSpringHttpSession.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2022 the original author or authors.
2+
* Copyright 2014-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,9 +21,11 @@
2121
import java.lang.annotation.Target;
2222

2323
import org.springframework.context.annotation.Import;
24+
import org.springframework.session.Session;
2425
import org.springframework.session.SessionRepository;
2526
import org.springframework.session.events.SessionCreatedEvent;
2627
import org.springframework.session.events.SessionDestroyedEvent;
28+
import org.springframework.session.web.http.SessionRepositoryFilter;
2729

2830
/**
2931
* Add this annotation to an {@code @Configuration} class to expose the
@@ -67,6 +69,7 @@
6769
* </ul>
6870
*
6971
* @author Rob Winch
72+
* @author Yanming Zhou
7073
* @since 1.1
7174
*/
7275
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@@ -75,4 +78,10 @@
7578
@Import(SpringHttpSessionConfiguration.class)
7679
public @interface EnableSpringHttpSession {
7780

81+
/**
82+
* Returns the {@link SessionRepositoryFilter} class to be used. Defaults to
83+
* {@link SessionRepositoryFilter}.
84+
*/
85+
Class<? extends SessionRepositoryFilter> sessionRepositoryFilterClass() default SessionRepositoryFilter.class;
86+
7887
}

spring-session-core/src/main/java/org/springframework/session/config/annotation/web/http/SpringHttpSessionConfiguration.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2022 the original author or authors.
2+
* Copyright 2014-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -32,6 +32,9 @@
3232
import org.springframework.context.ApplicationContextAware;
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Configuration;
35+
import org.springframework.context.annotation.ImportAware;
36+
import org.springframework.core.annotation.AnnotationAttributes;
37+
import org.springframework.core.type.AnnotationMetadata;
3538
import org.springframework.session.Session;
3639
import org.springframework.session.SessionRepository;
3740
import org.springframework.session.events.SessionCreatedEvent;
@@ -86,11 +89,12 @@
8689
*
8790
* @author Rob Winch
8891
* @author Vedran Pavic
92+
* @author Yanming Zhou
8993
* @since 1.1
9094
* @see EnableSpringHttpSession
9195
*/
9296
@Configuration(proxyBeanMethods = false)
93-
public class SpringHttpSessionConfiguration implements InitializingBean, ApplicationContextAware {
97+
public class SpringHttpSessionConfiguration implements InitializingBean, ApplicationContextAware, ImportAware {
9498

9599
private final Log logger = LogFactory.getLog(getClass());
96100

@@ -106,6 +110,18 @@ public class SpringHttpSessionConfiguration implements InitializingBean, Applica
106110

107111
private List<HttpSessionListener> httpSessionListeners = new ArrayList<>();
108112

113+
@SuppressWarnings("rawtypes")
114+
private Class<? extends SessionRepositoryFilter> sessionRepositoryFilterClass = SessionRepositoryFilter.class;
115+
116+
@Override
117+
public void setImportMetadata(AnnotationMetadata importMetadata) {
118+
AnnotationAttributes annotationAttributes = AnnotationAttributes
119+
.fromMap(importMetadata.getAnnotationAttributes(EnableSpringHttpSession.class.getName()));
120+
if (annotationAttributes != null) {
121+
this.sessionRepositoryFilterClass = annotationAttributes.getClass("sessionRepositoryFilterClass");
122+
}
123+
}
124+
109125
@Override
110126
public void afterPropertiesSet() {
111127
this.defaultHttpSessionIdResolver.setCookieSerializer(getCookieSerializer());
@@ -117,9 +133,18 @@ public SessionEventHttpSessionListenerAdapter sessionEventHttpSessionListenerAda
117133
}
118134

119135
@Bean
136+
@SuppressWarnings("unchecked")
120137
public <S extends Session> SessionRepositoryFilter<? extends Session> springSessionRepositoryFilter(
121138
SessionRepository<S> sessionRepository) {
122-
SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<>(sessionRepository);
139+
SessionRepositoryFilter<S> sessionRepositoryFilter;
140+
try {
141+
sessionRepositoryFilter = sessionRepositoryFilterClass.getConstructor(SessionRepository.class)
142+
.newInstance(sessionRepository);
143+
}
144+
catch (Exception e) {
145+
throw new IllegalArgumentException("Please make sure class [" + sessionRepositoryFilterClass
146+
+ "] has public constructor accepts SessionRepository parameter.", e);
147+
}
123148
sessionRepositoryFilter.setHttpSessionIdResolver(this.httpSessionIdResolver);
124149
return sessionRepositoryFilter;
125150
}

spring-session-core/src/test/java/org/springframework/session/config/annotation/web/http/SpringHttpSessionConfigurationTests.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Configuration;
3232
import org.springframework.mock.web.MockServletContext;
3333
import org.springframework.session.MapSessionRepository;
34+
import org.springframework.session.Session;
3435
import org.springframework.session.SessionRepository;
3536
import org.springframework.session.security.web.authentication.SpringSessionRememberMeServices;
3637
import org.springframework.session.web.http.CookieHttpSessionIdResolver;
@@ -50,6 +51,7 @@
5051
* Tests for {@link SpringHttpSessionConfiguration}.
5152
*
5253
* @author Vedran Pavic
54+
* @author Yanming Zhou
5355
*/
5456
class SpringHttpSessionConfigurationTests {
5557

@@ -130,6 +132,14 @@ void rememberMeServicesAndCustomDefaultCookieSerializerThenWarnIfRememberMeReque
130132
}
131133
}
132134

135+
@Test
136+
void tsst() {
137+
registerAndRefresh(CustomSessionRepositoryFilterConfiguration.class);
138+
139+
SessionRepositoryFilter<?> sessionRepositoryFilter = this.context.getBean(SessionRepositoryFilter.class);
140+
assertThat(sessionRepositoryFilter).isInstanceOf(MySessionRepositoryFilter.class);
141+
}
142+
133143
@Configuration
134144
@EnableSpringHttpSession
135145
static class EmptyConfiguration {
@@ -189,4 +199,18 @@ DefaultCookieSerializer defaultCookieSerializer() {
189199

190200
}
191201

202+
@Configuration
203+
@EnableSpringHttpSession(sessionRepositoryFilterClass = MySessionRepositoryFilter.class)
204+
static class CustomSessionRepositoryFilterConfiguration extends BaseConfiguration {
205+
206+
}
207+
208+
public static class MySessionRepositoryFilter extends SessionRepositoryFilter<Session> {
209+
210+
public MySessionRepositoryFilter(SessionRepository<Session> sessionRepository) {
211+
super(sessionRepository);
212+
}
213+
214+
}
215+
192216
}

0 commit comments

Comments
 (0)