Add support for customizing session repository before initialization
This commit adds support for customizing session repository implementations (both SessionRepository and ReactiveSessionRepository) before initialization by introducing SessionRepositoryCustomizer and ReactiveSessionRepositoryCustomizer strategies. Resolves: #1499
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2019 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
|
||||||
|
*
|
||||||
|
* https://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.session.config;
|
||||||
|
|
||||||
|
import org.springframework.session.ReactiveSessionRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strategy that can be used to customize the {@link ReactiveSessionRepository} before it
|
||||||
|
* is fully initialized, in particular to tune its configuration.
|
||||||
|
*
|
||||||
|
* @param <T> the {@link ReactiveSessionRepository} type
|
||||||
|
* @author Vedran Pavic
|
||||||
|
* @since 2.2.0
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface ReactiveSessionRepositoryCustomizer<T extends ReactiveSessionRepository> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Customize the {@link ReactiveSessionRepository}.
|
||||||
|
* @param sessionRepository the {@link ReactiveSessionRepository} to customize
|
||||||
|
*/
|
||||||
|
void customize(T sessionRepository);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2019 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
|
||||||
|
*
|
||||||
|
* https://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.session.config;
|
||||||
|
|
||||||
|
import org.springframework.session.SessionRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strategy that can be used to customize the {@link SessionRepository} before it is fully
|
||||||
|
* initialized, in particular to tune its configuration.
|
||||||
|
*
|
||||||
|
* @param <T> the {@link SessionRepository} type
|
||||||
|
* @author Vedran Pavic
|
||||||
|
* @since 2.2.0
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface SessionRepositoryCustomizer<T extends SessionRepository> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Customize the {@link SessionRepository}.
|
||||||
|
* @param sessionRepository the {@link SessionRepository} to customize
|
||||||
|
*/
|
||||||
|
void customize(T sessionRepository);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -18,8 +18,10 @@ package org.springframework.session.data.redis.config.annotation.web.http;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
@@ -51,6 +53,7 @@ import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
|||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.MapSession;
|
import org.springframework.session.MapSession;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
||||||
import org.springframework.session.data.redis.RedisFlushMode;
|
import org.springframework.session.data.redis.RedisFlushMode;
|
||||||
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
|
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
|
||||||
@@ -103,6 +106,8 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio
|
|||||||
|
|
||||||
private Executor redisSubscriptionExecutor;
|
private Executor redisSubscriptionExecutor;
|
||||||
|
|
||||||
|
private List<SessionRepositoryCustomizer<RedisOperationsSessionRepository>> sessionRepositoryCustomizers;
|
||||||
|
|
||||||
private ClassLoader classLoader;
|
private ClassLoader classLoader;
|
||||||
|
|
||||||
private StringValueResolver embeddedValueResolver;
|
private StringValueResolver embeddedValueResolver;
|
||||||
@@ -123,6 +128,8 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio
|
|||||||
sessionRepository.setSaveMode(this.saveMode);
|
sessionRepository.setSaveMode(this.saveMode);
|
||||||
int database = resolveDatabase();
|
int database = resolveDatabase();
|
||||||
sessionRepository.setDatabase(database);
|
sessionRepository.setDatabase(database);
|
||||||
|
this.sessionRepositoryCustomizers
|
||||||
|
.forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository));
|
||||||
return sessionRepository;
|
return sessionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,6 +228,12 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio
|
|||||||
this.redisSubscriptionExecutor = redisSubscriptionExecutor;
|
this.redisSubscriptionExecutor = redisSubscriptionExecutor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setSessionRepositoryCustomizer(
|
||||||
|
ObjectProvider<SessionRepositoryCustomizer<RedisOperationsSessionRepository>> sessionRepositoryCustomizers) {
|
||||||
|
this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBeanClassLoader(ClassLoader classLoader) {
|
public void setBeanClassLoader(ClassLoader classLoader) {
|
||||||
this.classLoader = classLoader;
|
this.classLoader = classLoader;
|
||||||
|
|||||||
@@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
package org.springframework.session.data.redis.config.annotation.web.server;
|
package org.springframework.session.data.redis.config.annotation.web.server;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.beans.factory.BeanClassLoaderAware;
|
import org.springframework.beans.factory.BeanClassLoaderAware;
|
||||||
import org.springframework.beans.factory.ObjectProvider;
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
@@ -36,6 +38,7 @@ import org.springframework.data.redis.serializer.RedisSerializer;
|
|||||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||||
import org.springframework.session.MapSession;
|
import org.springframework.session.MapSession;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.ReactiveSessionRepositoryCustomizer;
|
||||||
import org.springframework.session.config.annotation.web.server.SpringWebSessionConfiguration;
|
import org.springframework.session.config.annotation.web.server.SpringWebSessionConfiguration;
|
||||||
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
|
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
|
||||||
import org.springframework.session.data.redis.RedisFlushMode;
|
import org.springframework.session.data.redis.RedisFlushMode;
|
||||||
@@ -68,6 +71,8 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
|
|||||||
|
|
||||||
private RedisSerializer<Object> defaultRedisSerializer;
|
private RedisSerializer<Object> defaultRedisSerializer;
|
||||||
|
|
||||||
|
private List<ReactiveSessionRepositoryCustomizer<ReactiveRedisOperationsSessionRepository>> sessionRepositoryCustomizers;
|
||||||
|
|
||||||
private ClassLoader classLoader;
|
private ClassLoader classLoader;
|
||||||
|
|
||||||
private StringValueResolver embeddedValueResolver;
|
private StringValueResolver embeddedValueResolver;
|
||||||
@@ -82,6 +87,8 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
|
|||||||
sessionRepository.setRedisKeyNamespace(this.redisNamespace);
|
sessionRepository.setRedisKeyNamespace(this.redisNamespace);
|
||||||
}
|
}
|
||||||
sessionRepository.setSaveMode(this.saveMode);
|
sessionRepository.setSaveMode(this.saveMode);
|
||||||
|
this.sessionRepositoryCustomizers
|
||||||
|
.forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository));
|
||||||
return sessionRepository;
|
return sessionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +127,12 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
|
|||||||
this.defaultRedisSerializer = defaultRedisSerializer;
|
this.defaultRedisSerializer = defaultRedisSerializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setSessionRepositoryCustomizer(
|
||||||
|
ObjectProvider<ReactiveSessionRepositoryCustomizer<ReactiveRedisOperationsSessionRepository>> sessionRepositoryCustomizers) {
|
||||||
|
this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBeanClassLoader(ClassLoader classLoader) {
|
public void setBeanClassLoader(ClassLoader classLoader) {
|
||||||
this.classLoader = classLoader;
|
this.classLoader = classLoader;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.data.redis.connection.RedisConnection;
|
import org.springframework.data.redis.connection.RedisConnection;
|
||||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||||
import org.springframework.data.redis.core.RedisOperations;
|
import org.springframework.data.redis.core.RedisOperations;
|
||||||
@@ -36,6 +37,7 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
|||||||
import org.springframework.mock.env.MockEnvironment;
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.data.redis.RedisFlushMode;
|
import org.springframework.session.data.redis.RedisFlushMode;
|
||||||
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
|
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
|
||||||
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory;
|
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory;
|
||||||
@@ -57,6 +59,8 @@ import static org.mockito.Mockito.mock;
|
|||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
class RedisHttpSessionConfigurationTests {
|
class RedisHttpSessionConfigurationTests {
|
||||||
|
|
||||||
|
private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600;
|
||||||
|
|
||||||
private static final String CLEANUP_CRON_EXPRESSION = "0 0 * * * *";
|
private static final String CLEANUP_CRON_EXPRESSION = "0 0 * * * *";
|
||||||
|
|
||||||
private AnnotationConfigApplicationContext context;
|
private AnnotationConfigApplicationContext context;
|
||||||
@@ -238,6 +242,15 @@ class RedisHttpSessionConfigurationTests {
|
|||||||
assertThat(beans).containsKeys("springSessionRedisMessageListenerContainer", "redisMessageListenerContainer");
|
assertThat(beans).containsKeys("springSessionRedisMessageListenerContainer", "redisMessageListenerContainer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sessionRepositoryCustomizer() {
|
||||||
|
registerAndRefresh(RedisConfig.class, SessionRepositoryCustomizerConfiguration.class);
|
||||||
|
RedisOperationsSessionRepository sessionRepository = this.context
|
||||||
|
.getBean(RedisOperationsSessionRepository.class);
|
||||||
|
assertThat(sessionRepository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval",
|
||||||
|
MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
||||||
this.context.register(annotatedClasses);
|
this.context.register(annotatedClasses);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
@@ -416,4 +429,22 @@ class RedisHttpSessionConfigurationTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EnableRedisHttpSession
|
||||||
|
static class SessionRepositoryCustomizerConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(0)
|
||||||
|
public SessionRepositoryCustomizer<RedisOperationsSessionRepository> sessionRepositoryCustomizerOne() {
|
||||||
|
return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(1)
|
||||||
|
public SessionRepositoryCustomizer<RedisOperationsSessionRepository> sessionRepositoryCustomizerTwo() {
|
||||||
|
return (sessionRepository) -> sessionRepository
|
||||||
|
.setDefaultMaxInactiveInterval(MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,13 @@ 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.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
|
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
|
||||||
import org.springframework.data.redis.core.ReactiveRedisOperations;
|
import org.springframework.data.redis.core.ReactiveRedisOperations;
|
||||||
import org.springframework.data.redis.serializer.RedisSerializationContext;
|
import org.springframework.data.redis.serializer.RedisSerializationContext;
|
||||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.ReactiveSessionRepositoryCustomizer;
|
||||||
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
|
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
|
||||||
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory;
|
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory;
|
||||||
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations;
|
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations;
|
||||||
@@ -222,6 +224,15 @@ class RedisWebSessionConfigurationTests {
|
|||||||
"serializer")).isEqualTo(redisSerializer);
|
"serializer")).isEqualTo(redisSerializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sessionRepositoryCustomizer() {
|
||||||
|
registerAndRefresh(RedisConfig.class, SessionRepositoryCustomizerConfiguration.class);
|
||||||
|
ReactiveRedisOperationsSessionRepository sessionRepository = this.context
|
||||||
|
.getBean(ReactiveRedisOperationsSessionRepository.class);
|
||||||
|
assertThat(sessionRepository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval",
|
||||||
|
MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
||||||
this.context.register(annotatedClasses);
|
this.context.register(annotatedClasses);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
@@ -348,4 +359,22 @@ class RedisWebSessionConfigurationTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EnableRedisWebSession
|
||||||
|
static class SessionRepositoryCustomizerConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(0)
|
||||||
|
public ReactiveSessionRepositoryCustomizer<ReactiveRedisOperationsSessionRepository> sessionRepositoryCustomizerOne() {
|
||||||
|
return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(1)
|
||||||
|
public ReactiveSessionRepositoryCustomizer<ReactiveRedisOperationsSessionRepository> sessionRepositoryCustomizerTwo() {
|
||||||
|
return (sessionRepository) -> sessionRepository
|
||||||
|
.setDefaultMaxInactiveInterval(MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
package org.springframework.session.hazelcast.config.annotation.web.http;
|
package org.springframework.session.hazelcast.config.annotation.web.http;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.hazelcast.core.HazelcastInstance;
|
import com.hazelcast.core.HazelcastInstance;
|
||||||
|
|
||||||
@@ -31,6 +33,7 @@ import org.springframework.core.type.AnnotationMetadata;
|
|||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.MapSession;
|
import org.springframework.session.MapSession;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
||||||
import org.springframework.session.hazelcast.HazelcastFlushMode;
|
import org.springframework.session.hazelcast.HazelcastFlushMode;
|
||||||
import org.springframework.session.hazelcast.HazelcastSessionRepository;
|
import org.springframework.session.hazelcast.HazelcastSessionRepository;
|
||||||
@@ -63,6 +66,8 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur
|
|||||||
|
|
||||||
private ApplicationEventPublisher applicationEventPublisher;
|
private ApplicationEventPublisher applicationEventPublisher;
|
||||||
|
|
||||||
|
private List<SessionRepositoryCustomizer<HazelcastSessionRepository>> sessionRepositoryCustomizers;
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public HazelcastSessionRepository sessionRepository() {
|
public HazelcastSessionRepository sessionRepository() {
|
||||||
HazelcastSessionRepository sessionRepository = new HazelcastSessionRepository(this.hazelcastInstance);
|
HazelcastSessionRepository sessionRepository = new HazelcastSessionRepository(this.hazelcastInstance);
|
||||||
@@ -73,6 +78,8 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur
|
|||||||
sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds);
|
sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds);
|
||||||
sessionRepository.setFlushMode(this.flushMode);
|
sessionRepository.setFlushMode(this.flushMode);
|
||||||
sessionRepository.setSaveMode(this.saveMode);
|
sessionRepository.setSaveMode(this.saveMode);
|
||||||
|
this.sessionRepositoryCustomizers
|
||||||
|
.forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository));
|
||||||
return sessionRepository;
|
return sessionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,6 +120,12 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur
|
|||||||
this.applicationEventPublisher = applicationEventPublisher;
|
this.applicationEventPublisher = applicationEventPublisher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setSessionRepositoryCustomizer(
|
||||||
|
ObjectProvider<SessionRepositoryCustomizer<HazelcastSessionRepository>> sessionRepositoryCustomizers) {
|
||||||
|
this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void setImportMetadata(AnnotationMetadata importMetadata) {
|
public void setImportMetadata(AnnotationMetadata importMetadata) {
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ 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.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.hazelcast.HazelcastFlushMode;
|
import org.springframework.session.hazelcast.HazelcastFlushMode;
|
||||||
import org.springframework.session.hazelcast.HazelcastSessionRepository;
|
import org.springframework.session.hazelcast.HazelcastSessionRepository;
|
||||||
import org.springframework.session.hazelcast.config.annotation.SpringSessionHazelcastInstance;
|
import org.springframework.session.hazelcast.config.annotation.SpringSessionHazelcastInstance;
|
||||||
@@ -222,6 +224,14 @@ class HazelcastHttpSessionConfigurationTests {
|
|||||||
.withMessageContaining("expected single matching bean but found 2");
|
.withMessageContaining("expected single matching bean but found 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sessionRepositoryCustomizer() {
|
||||||
|
registerAndRefresh(SessionRepositoryCustomizerConfiguration.class);
|
||||||
|
HazelcastSessionRepository sessionRepository = this.context.getBean(HazelcastSessionRepository.class);
|
||||||
|
assertThat(sessionRepository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval",
|
||||||
|
MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
||||||
this.context.register(annotatedClasses);
|
this.context.register(annotatedClasses);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
@@ -421,4 +431,22 @@ class HazelcastHttpSessionConfigurationTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EnableHazelcastHttpSession
|
||||||
|
static class SessionRepositoryCustomizerConfiguration extends BaseConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(0)
|
||||||
|
public SessionRepositoryCustomizer<HazelcastSessionRepository> sessionRepositoryCustomizerOne() {
|
||||||
|
return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(1)
|
||||||
|
public SessionRepositoryCustomizer<HazelcastSessionRepository> sessionRepositoryCustomizerTwo() {
|
||||||
|
return (sessionRepository) -> sessionRepository
|
||||||
|
.setDefaultMaxInactiveInterval(MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
package org.springframework.session.jdbc.config.annotation.web.http;
|
package org.springframework.session.jdbc.config.annotation.web.http;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
@@ -45,6 +47,7 @@ import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
|||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.MapSession;
|
import org.springframework.session.MapSession;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
|
||||||
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
|
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
|
||||||
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
|
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
|
||||||
@@ -98,6 +101,8 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
|
|||||||
|
|
||||||
private ConversionService conversionService;
|
private ConversionService conversionService;
|
||||||
|
|
||||||
|
private List<SessionRepositoryCustomizer<JdbcOperationsSessionRepository>> sessionRepositoryCustomizers;
|
||||||
|
|
||||||
private ClassLoader classLoader;
|
private ClassLoader classLoader;
|
||||||
|
|
||||||
private StringValueResolver embeddedValueResolver;
|
private StringValueResolver embeddedValueResolver;
|
||||||
@@ -133,6 +138,8 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
|
|||||||
else {
|
else {
|
||||||
sessionRepository.setConversionService(createConversionServiceWithBeanClassLoader(this.classLoader));
|
sessionRepository.setConversionService(createConversionServiceWithBeanClassLoader(this.classLoader));
|
||||||
}
|
}
|
||||||
|
this.sessionRepositoryCustomizers
|
||||||
|
.forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository));
|
||||||
return sessionRepository;
|
return sessionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +212,12 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
|
|||||||
this.conversionService = conversionService;
|
this.conversionService = conversionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setSessionRepositoryCustomizer(
|
||||||
|
ObjectProvider<SessionRepositoryCustomizer<JdbcOperationsSessionRepository>> sessionRepositoryCustomizers) {
|
||||||
|
this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBeanClassLoader(ClassLoader classLoader) {
|
public void setBeanClassLoader(ClassLoader classLoader) {
|
||||||
this.classLoader = classLoader;
|
this.classLoader = classLoader;
|
||||||
|
|||||||
@@ -27,12 +27,14 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.core.convert.ConversionService;
|
import org.springframework.core.convert.ConversionService;
|
||||||
import org.springframework.jdbc.core.JdbcOperations;
|
import org.springframework.jdbc.core.JdbcOperations;
|
||||||
import org.springframework.jdbc.support.lob.LobHandler;
|
import org.springframework.jdbc.support.lob.LobHandler;
|
||||||
import org.springframework.mock.env.MockEnvironment;
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
import org.springframework.session.FlushMode;
|
import org.springframework.session.FlushMode;
|
||||||
import org.springframework.session.SaveMode;
|
import org.springframework.session.SaveMode;
|
||||||
|
import org.springframework.session.config.SessionRepositoryCustomizer;
|
||||||
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
|
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
|
||||||
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
|
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
|
||||||
import org.springframework.test.util.ReflectionTestUtils;
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
@@ -274,6 +276,14 @@ class JdbcHttpSessionConfigurationTests {
|
|||||||
assertThat(ReflectionTestUtils.getField(configuration, "tableName")).isEqualTo("custom_session_table");
|
assertThat(ReflectionTestUtils.getField(configuration, "tableName")).isEqualTo("custom_session_table");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sessionRepositoryCustomizer() {
|
||||||
|
registerAndRefresh(DataSourceConfiguration.class, SessionRepositoryCustomizerConfiguration.class);
|
||||||
|
JdbcOperationsSessionRepository sessionRepository = this.context.getBean(JdbcOperationsSessionRepository.class);
|
||||||
|
assertThat(sessionRepository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval",
|
||||||
|
MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
private void registerAndRefresh(Class<?>... annotatedClasses) {
|
||||||
this.context.register(annotatedClasses);
|
this.context.register(annotatedClasses);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
@@ -473,4 +483,22 @@ class JdbcHttpSessionConfigurationTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EnableJdbcHttpSession
|
||||||
|
static class SessionRepositoryCustomizerConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(0)
|
||||||
|
public SessionRepositoryCustomizer<JdbcOperationsSessionRepository> sessionRepositoryCustomizerOne() {
|
||||||
|
return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Order(1)
|
||||||
|
public SessionRepositoryCustomizer<JdbcOperationsSessionRepository> sessionRepositoryCustomizerTwo() {
|
||||||
|
return (sessionRepository) -> sessionRepository
|
||||||
|
.setDefaultMaxInactiveInterval(MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user