Skip to content

Commit d4a3e2e

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

File tree

3 files changed

+66
-5
lines changed

3 files changed

+66
-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.
@@ -24,6 +24,7 @@
2424
import org.springframework.session.SessionRepository;
2525
import org.springframework.session.events.SessionCreatedEvent;
2626
import org.springframework.session.events.SessionDestroyedEvent;
27+
import org.springframework.session.web.http.SessionRepositoryFilter;
2728

2829
/**
2930
* Add this annotation to an {@code @Configuration} class to expose the
@@ -67,6 +68,7 @@
6768
* </ul>
6869
*
6970
* @author Rob Winch
71+
* @author Yanming Zhou
7072
* @since 1.1
7173
*/
7274
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@@ -75,4 +77,11 @@
7577
@Import(SpringHttpSessionConfiguration.class)
7678
public @interface EnableSpringHttpSession {
7779

80+
/**
81+
* Returns the {@link SessionRepositoryFilter} class to be used. Defaults to
82+
* {@link SessionRepositoryFilter}.
83+
* @return the {@link SessionRepositoryFilter} class
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: 31 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.
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.session.config.annotation.web.http;
1818

19+
import java.lang.reflect.Constructor;
1920
import java.util.ArrayList;
2021
import java.util.List;
2122

@@ -32,6 +33,9 @@
3233
import org.springframework.context.ApplicationContextAware;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.annotation.ImportAware;
37+
import org.springframework.core.annotation.AnnotationAttributes;
38+
import org.springframework.core.type.AnnotationMetadata;
3539
import org.springframework.session.Session;
3640
import org.springframework.session.SessionRepository;
3741
import org.springframework.session.events.SessionCreatedEvent;
@@ -86,11 +90,12 @@
8690
*
8791
* @author Rob Winch
8892
* @author Vedran Pavic
93+
* @author Yanming Zhou
8994
* @since 1.1
9095
* @see EnableSpringHttpSession
9196
*/
9297
@Configuration(proxyBeanMethods = false)
93-
public class SpringHttpSessionConfiguration implements InitializingBean, ApplicationContextAware {
98+
public class SpringHttpSessionConfiguration implements InitializingBean, ApplicationContextAware, ImportAware {
9499

95100
private final Log logger = LogFactory.getLog(getClass());
96101

@@ -106,6 +111,18 @@ public class SpringHttpSessionConfiguration implements InitializingBean, Applica
106111

107112
private List<HttpSessionListener> httpSessionListeners = new ArrayList<>();
108113

114+
@SuppressWarnings("rawtypes")
115+
private Class<? extends SessionRepositoryFilter> sessionRepositoryFilterClass = SessionRepositoryFilter.class;
116+
117+
@Override
118+
public void setImportMetadata(AnnotationMetadata importMetadata) {
119+
AnnotationAttributes annotationAttributes = AnnotationAttributes
120+
.fromMap(importMetadata.getAnnotationAttributes(EnableSpringHttpSession.class.getName()));
121+
if (annotationAttributes != null) {
122+
this.sessionRepositoryFilterClass = annotationAttributes.getClass("sessionRepositoryFilterClass");
123+
}
124+
}
125+
109126
@Override
110127
public void afterPropertiesSet() {
111128
this.defaultHttpSessionIdResolver.setCookieSerializer(getCookieSerializer());
@@ -117,9 +134,20 @@ public SessionEventHttpSessionListenerAdapter sessionEventHttpSessionListenerAda
117134
}
118135

119136
@Bean
137+
@SuppressWarnings({ "unchecked", "rawtypes" })
120138
public <S extends Session> SessionRepositoryFilter<? extends Session> springSessionRepositoryFilter(
121139
SessionRepository<S> sessionRepository) {
122-
SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<>(sessionRepository);
140+
SessionRepositoryFilter<S> sessionRepositoryFilter;
141+
try {
142+
Constructor<? extends SessionRepositoryFilter> ctor = this.sessionRepositoryFilterClass
143+
.getDeclaredConstructor(SessionRepository.class);
144+
ctor.setAccessible(true);
145+
sessionRepositoryFilter = ctor.newInstance(sessionRepository);
146+
}
147+
catch (Exception ex) {
148+
throw new IllegalArgumentException("Please make sure class [" + this.sessionRepositoryFilterClass
149+
+ "] has public constructor accepts SessionRepository parameter.", ex);
150+
}
123151
sessionRepositoryFilter.setHttpSessionIdResolver(this.httpSessionIdResolver);
124152
return sessionRepositoryFilter;
125153
}

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 customizeSessionRepositoryFilter() {
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+
MySessionRepositoryFilter(SessionRepository<Session> sessionRepository) {
211+
super(sessionRepository);
212+
}
213+
214+
}
215+
192216
}

0 commit comments

Comments
 (0)