diff --git a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryITests.java b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryITests.java index 501b2d221..fe17d5132 100644 --- a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryITests.java +++ b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryITests.java @@ -39,7 +39,7 @@ import org.springframework.session.data.SessionEventRegistry; import org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisIndexedHttpSession; import org.springframework.session.events.SessionCreatedEvent; import org.springframework.session.events.SessionDestroyedEvent; import org.springframework.test.context.ContextConfiguration; @@ -691,7 +691,7 @@ private String getChangedSecurityName() { } @Configuration - @EnableRedisHttpSession(redisNamespace = "RedisIndexedSessionRepositoryITests", enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(redisNamespace = "RedisIndexedSessionRepositoryITests") static class Config extends BaseConfig { @Bean diff --git a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSessionExpireSessionDestroyedTests.java b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSessionExpireSessionDestroyedTests.java similarity index 95% rename from spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSessionExpireSessionDestroyedTests.java rename to spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSessionExpireSessionDestroyedTests.java index 10fd1415f..744ba6d78 100644 --- a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSessionExpireSessionDestroyedTests.java +++ b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSessionExpireSessionDestroyedTests.java @@ -44,7 +44,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration @WebAppConfiguration -class EnableRedisHttpSessionExpireSessionDestroyedTests extends AbstractRedisITests { +class EnableRedisIndexedHttpSessionExpireSessionDestroyedTests extends AbstractRedisITests { @Autowired private SessionRepository repository; @@ -113,7 +113,7 @@ void setLock(Object lock) { } @Configuration - @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1, enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(maxInactiveIntervalInSeconds = 1) static class Config extends BaseConfig { @Bean diff --git a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/taskexecutor/RedisListenerContainerTaskExecutorITests.java b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/taskexecutor/RedisListenerContainerTaskExecutorITests.java index e70f159c2..0345e123f 100644 --- a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/taskexecutor/RedisListenerContainerTaskExecutorITests.java +++ b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/taskexecutor/RedisListenerContainerTaskExecutorITests.java @@ -32,7 +32,7 @@ import org.springframework.data.redis.core.RedisOperations; import org.springframework.session.data.redis.AbstractRedisITests; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisIndexedHttpSession; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; @@ -101,7 +101,7 @@ boolean taskDispatched() throws InterruptedException { } @Configuration - @EnableRedisHttpSession(redisNamespace = "RedisListenerContainerTaskExecutorITests", enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(redisNamespace = "RedisListenerContainerTaskExecutorITests") static class Config extends BaseConfig { @Bean diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java index 19f3e0a25..60e82ed04 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2021 the original author or authors. + * Copyright 2014-2022 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. @@ -288,7 +288,7 @@ public class RedisIndexedSessionRepository private byte[] expiredKeyPrefixBytes; - private final RedisOperations sessionRedisOperations; + private final RedisOperations sessionRedisOperations; private final RedisSessionExpirationPolicy expirationPolicy; @@ -314,7 +314,7 @@ public class RedisIndexedSessionRepository * @param sessionRedisOperations the {@link RedisOperations} to use for managing the * sessions. Cannot be null. */ - public RedisIndexedSessionRepository(RedisOperations sessionRedisOperations) { + public RedisIndexedSessionRepository(RedisOperations sessionRedisOperations) { Assert.notNull(sessionRedisOperations, "sessionRedisOperations cannot be null"); this.sessionRedisOperations = sessionRedisOperations; this.expirationPolicy = new RedisSessionExpirationPolicy(sessionRedisOperations, this::getExpirationsKey, @@ -406,7 +406,7 @@ private void configureSessionChannels() { * Returns the {@link RedisOperations} used for sessions. * @return the {@link RedisOperations} used for sessions */ - public RedisOperations getSessionRedisOperations() { + public RedisOperations getSessionRedisOperations() { return this.sessionRedisOperations; } @@ -454,7 +454,7 @@ public Map findByIndexNameAndIndexValue(String indexName, * @return the Redis session */ private RedisSession getSession(String id, boolean allowExpired) { - Map entries = getSessionBoundHashOperations(id).entries(); + Map entries = getSessionBoundHashOperations(id).entries(); if (entries.isEmpty()) { return null; } @@ -467,10 +467,10 @@ private RedisSession getSession(String id, boolean allowExpired) { return result; } - private MapSession loadSession(String id, Map entries) { + private MapSession loadSession(String id, Map entries) { MapSession loaded = new MapSession(id); - for (Map.Entry entry : entries.entrySet()) { - String key = (String) entry.getKey(); + for (Map.Entry entry : entries.entrySet()) { + String key = entry.getKey(); if (RedisSessionMapper.CREATION_TIME_KEY.equals(key)) { loaded.setCreationTime(Instant.ofEpochMilli((long) entry.getValue())); } @@ -522,7 +522,7 @@ public void onMessage(Message message, byte[] pattern) { if (ByteUtils.startsWith(messageChannel, this.sessionCreatedChannelPrefixBytes)) { // TODO: is this thread safe? @SuppressWarnings("unchecked") - Map loaded = (Map) this.defaultSerializer.deserialize(message.getBody()); + Map loaded = (Map) this.defaultSerializer.deserialize(message.getBody()); handleCreated(loaded, new String(messageChannel)); return; } @@ -571,7 +571,7 @@ private void cleanupPrincipalIndex(RedisSession session) { } } - private void handleCreated(Map loaded, String channel) { + private void handleCreated(Map loaded, String channel) { String id = channel.substring(channel.lastIndexOf(":") + 1); Session session = loadSession(id, loaded); publishEvent(new SessionCreatedEvent(this, session)); @@ -661,7 +661,7 @@ public String getSessionExpiredChannel() { * @param sessionId the id of the {@link Session} to work with * @return the {@link BoundHashOperations} to operate on a {@link Session} */ - private BoundHashOperations getSessionBoundHashOperations(String sessionId) { + private BoundHashOperations getSessionBoundHashOperations(String sessionId) { String key = getSessionKey(sessionId); return this.sessionRedisOperations.boundHashOps(key); } diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java index d67fbc83a..33097813d 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2021 the original author or authors. + * Copyright 2014-2022 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. @@ -52,13 +52,13 @@ final class RedisSessionExpirationPolicy { private static final String SESSION_EXPIRES_PREFIX = "expires:"; - private final RedisOperations redis; + private final RedisOperations redis; private final Function lookupExpirationKey; private final Function lookupSessionKey; - RedisSessionExpirationPolicy(RedisOperations sessionRedisOperations, + RedisSessionExpirationPolicy(RedisOperations sessionRedisOperations, Function lookupExpirationKey, Function lookupSessionKey) { super(); this.redis = sessionRedisOperations; @@ -96,7 +96,7 @@ void onExpirationUpdated(Long originalExpirationTimeInMilli, Session session) { } String expireKey = getExpirationKey(toExpire); - BoundSetOperations expireOperations = this.redis.boundSetOps(expireKey); + BoundSetOperations expireOperations = this.redis.boundSetOps(expireKey); expireOperations.add(keyToExpire); long fiveMinutesAfterExpires = sessionExpireInSeconds + TimeUnit.MINUTES.toSeconds(5); diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/AbstractRedisHttpSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/AbstractRedisHttpSessionConfiguration.java new file mode 100644 index 000000000..34a953c3e --- /dev/null +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/AbstractRedisHttpSessionConfiguration.java @@ -0,0 +1,159 @@ +/* + * Copyright 2014-2022 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.data.redis.config.annotation.web.http; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.session.FlushMode; +import org.springframework.session.MapSession; +import org.springframework.session.SaveMode; +import org.springframework.session.Session; +import org.springframework.session.SessionRepository; +import org.springframework.session.config.SessionRepositoryCustomizer; +import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; +import org.springframework.session.data.redis.RedisSessionRepository; +import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory; +import org.springframework.util.Assert; + +/** + * Base configuration class for Redis based {@link SessionRepository} implementations. + * + * @param the {@link SessionRepository} type + * @author Vedran Pavic + * @since 3.0.0 + * @see RedisHttpSessionConfiguration + * @see RedisIndexedHttpSessionConfiguration + * @see SpringSessionRedisConnectionFactory + */ +@Configuration(proxyBeanMethods = false) +public abstract class AbstractRedisHttpSessionConfiguration> + extends SpringHttpSessionConfiguration implements BeanClassLoaderAware { + + private Integer maxInactiveIntervalInSeconds = MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS; + + private String redisNamespace = RedisSessionRepository.DEFAULT_KEY_NAMESPACE; + + private FlushMode flushMode = FlushMode.ON_SAVE; + + private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE; + + private RedisConnectionFactory redisConnectionFactory; + + private RedisSerializer defaultRedisSerializer; + + private List> sessionRepositoryCustomizers; + + private ClassLoader classLoader; + + public abstract T sessionRepository(); + + public void setMaxInactiveIntervalInSeconds(int maxInactiveIntervalInSeconds) { + this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; + } + + protected Integer getMaxInactiveIntervalInSeconds() { + return this.maxInactiveIntervalInSeconds; + } + + public void setRedisNamespace(String namespace) { + Assert.hasText(namespace, "namespace must not be empty"); + this.redisNamespace = namespace; + } + + protected String getRedisNamespace() { + return this.redisNamespace; + } + + public void setFlushMode(FlushMode flushMode) { + Assert.notNull(flushMode, "flushMode must not be null"); + this.flushMode = flushMode; + } + + protected FlushMode getFlushMode() { + return this.flushMode; + } + + public void setSaveMode(SaveMode saveMode) { + Assert.notNull(saveMode, "saveMode must not be null"); + this.saveMode = saveMode; + } + + protected SaveMode getSaveMode() { + return this.saveMode; + } + + @Autowired + public void setRedisConnectionFactory( + @SpringSessionRedisConnectionFactory ObjectProvider springSessionRedisConnectionFactory, + ObjectProvider redisConnectionFactory) { + this.redisConnectionFactory = springSessionRedisConnectionFactory + .getIfAvailable(redisConnectionFactory::getObject); + } + + protected RedisConnectionFactory getRedisConnectionFactory() { + return this.redisConnectionFactory; + } + + @Autowired(required = false) + @Qualifier("springSessionDefaultRedisSerializer") + public void setDefaultRedisSerializer(RedisSerializer defaultRedisSerializer) { + this.defaultRedisSerializer = defaultRedisSerializer; + } + + protected RedisSerializer getDefaultRedisSerializer() { + return this.defaultRedisSerializer; + } + + @Autowired(required = false) + public void setSessionRepositoryCustomizer( + ObjectProvider> sessionRepositoryCustomizers) { + this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList()); + } + + protected List> getSessionRepositoryCustomizers() { + return this.sessionRepositoryCustomizers; + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + protected RedisTemplate createRedisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + if (getDefaultRedisSerializer() != null) { + redisTemplate.setDefaultSerializer(getDefaultRedisSerializer()); + } + redisTemplate.setConnectionFactory(getRedisConnectionFactory()); + redisTemplate.setBeanClassLoader(this.classLoader); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + +} diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSession.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSession.java index 4df427778..df59fc61b 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSession.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisHttpSession.java @@ -31,15 +31,14 @@ import org.springframework.session.Session; import org.springframework.session.SessionRepository; import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; -import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.data.redis.RedisSessionRepository; import org.springframework.session.web.http.SessionRepositoryFilter; /** * Add this annotation to an {@code @Configuration} class to expose the * {@link SessionRepositoryFilter} as a bean named {@code springSessionRepositoryFilter} - * and backed by Redis. In order to leverage the annotation, a single - * {@link RedisConnectionFactory} must be provided. For example: + * and backed by {@link RedisSessionRepository}. In order to leverage the annotation, a + * single {@link RedisConnectionFactory} must be provided. For example: * *
  * @Configuration
@@ -54,8 +53,7 @@
  * }
  * 
* - * More advanced configurations can extend {@link RedisHttpSessionConfiguration} or - * {@link RedisIndexedHttpSessionConfiguration} instead. + * More advanced configurations can extend {@link RedisHttpSessionConfiguration} instead. * * @author Rob Winch * @author Vedran Pavic @@ -65,7 +63,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented -@Import(RedisHttpSessionConfigurationSelector.class) +@Import(RedisHttpSessionConfiguration.class) @Configuration(proxyBeanMethods = false) public @interface EnableRedisHttpSession { @@ -86,7 +84,7 @@ * the applications and they could function within the same Redis instance. * @return the unique namespace for keys */ - String redisNamespace() default RedisIndexedSessionRepository.DEFAULT_NAMESPACE; + String redisNamespace() default RedisSessionRepository.DEFAULT_KEY_NAMESPACE; /** * Flush mode for the Redis sessions. The default is {@code ON_SAVE} which only @@ -108,13 +106,4 @@ */ SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE; - /** - * Indicate whether the {@link SessionRepository} should publish session events and - * support fetching sessions by index. If true, a - * {@link RedisIndexedSessionRepository} will be used in place of - * {@link RedisSessionRepository}. This will result in slower performance. - * @return true if indexing and events should be enabled, false otherwise - */ - boolean enableIndexingAndEvents() default false; - } diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSession.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSession.java new file mode 100644 index 000000000..f483fe338 --- /dev/null +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/EnableRedisIndexedHttpSession.java @@ -0,0 +1,113 @@ +/* + * Copyright 2014-2022 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.data.redis.config.annotation.web.http; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.session.FlushMode; +import org.springframework.session.MapSession; +import org.springframework.session.SaveMode; +import org.springframework.session.Session; +import org.springframework.session.SessionRepository; +import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; +import org.springframework.session.data.redis.RedisIndexedSessionRepository; +import org.springframework.session.web.http.SessionRepositoryFilter; + +/** + * Add this annotation to an {@code @Configuration} class to expose the + * {@link SessionRepositoryFilter} as a bean named {@code springSessionRepositoryFilter} + * and backed by {@link RedisIndexedSessionRepository}. In order to leverage the + * annotation, a single {@link RedisConnectionFactory} must be provided. For example: + * + *
+ * @Configuration
+ * @EnableRedisIndexedHttpSession
+ * public class RedisHttpSessionConfig {
+ *
+ *     @Bean
+ *     public LettuceConnectionFactory redisConnectionFactory() {
+ *         return new LettuceConnectionFactory();
+ *     }
+ *
+ * }
+ * 
+ * + * More advanced configurations can extend {@link RedisIndexedHttpSessionConfiguration} + * instead. + * + * @author Vedran Pavic + * @since 3.0.0 + * @see EnableSpringHttpSession + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented +@Import(RedisIndexedHttpSessionConfiguration.class) +@Configuration(proxyBeanMethods = false) +public @interface EnableRedisIndexedHttpSession { + + /** + * The session timeout in seconds. By default, it is set to 1800 seconds (30 minutes). + * This should be a non-negative integer. + * @return the seconds a session can be inactive before expiring + */ + int maxInactiveIntervalInSeconds() default MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS; + + /** + * Defines a unique namespace for keys. The value is used to isolate sessions by + * changing the prefix from default {@code spring:session:} to + * {@code :}. + *

+ * For example, if you had an application named "Application A" that needed to keep + * the sessions isolated from "Application B" you could set two different values for + * the applications and they could function within the same Redis instance. + * @return the unique namespace for keys + */ + String redisNamespace() default RedisIndexedSessionRepository.DEFAULT_NAMESPACE; + + /** + * Flush mode for the Redis sessions. The default is {@code ON_SAVE} which only + * updates the backing Redis when {@link SessionRepository#save(Session)} is invoked. + * In a web environment this happens just before the HTTP response is committed. + *

+ * Setting the value to {@code IMMEDIATE} will ensure that the any updates to the + * Session are immediately written to the Redis instance. + * @return the {@link FlushMode} to use + */ + FlushMode flushMode() default FlushMode.ON_SAVE; + + /** + * Save mode for the session. The default is {@link SaveMode#ON_SET_ATTRIBUTE}, which + * only saves changes made to session. + * @return the save mode + */ + SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE; + + /** + * The cron expression for expired session cleanup job. By default runs every minute. + * @return the session cleanup cron expression + */ + String cleanupCron() default RedisIndexedHttpSessionConfiguration.DEFAULT_CLEANUP_CRON; + +} diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java index 923a382dc..443095c87 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java @@ -17,14 +17,8 @@ package org.springframework.session.data.redis.config.annotation.web.http; import java.time.Duration; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -33,24 +27,15 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.session.FlushMode; -import org.springframework.session.MapSession; -import org.springframework.session.SaveMode; -import org.springframework.session.config.SessionRepositoryCustomizer; -import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; import org.springframework.session.data.redis.RedisSessionRepository; -import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory; import org.springframework.session.web.http.SessionRepositoryFilter; -import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.util.StringValueResolver; /** * Exposes the {@link SessionRepositoryFilter} as a bean named - * {@code springSessionRepositoryFilter}. In order to use this a single - * {@link RedisConnectionFactory} must be exposed as a Bean. + * {@code springSessionRepositoryFilter} backed by {@link RedisSessionRepository}. In + * order to use this a single {@link RedisConnectionFactory} must be exposed as a Bean. * * @author Rob Winch * @author EddĂș MelĂ©ndez @@ -59,87 +44,27 @@ * @see EnableRedisHttpSession */ @Configuration(proxyBeanMethods = false) -public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguration - implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { - - private Integer maxInactiveIntervalInSeconds = MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS; - - private String redisNamespace = RedisSessionRepository.DEFAULT_KEY_NAMESPACE; - - private FlushMode flushMode = FlushMode.ON_SAVE; - - private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE; - - private RedisConnectionFactory redisConnectionFactory; - - private RedisSerializer defaultRedisSerializer; - - private List> sessionRepositoryCustomizers; - - private ClassLoader classLoader; +public class RedisHttpSessionConfiguration extends AbstractRedisHttpSessionConfiguration + implements EmbeddedValueResolverAware, ImportAware { private StringValueResolver embeddedValueResolver; @Bean + @Override public RedisSessionRepository sessionRepository() { RedisTemplate redisTemplate = createRedisTemplate(); RedisSessionRepository sessionRepository = new RedisSessionRepository(redisTemplate); - sessionRepository.setDefaultMaxInactiveInterval(Duration.ofSeconds(this.maxInactiveIntervalInSeconds)); - if (StringUtils.hasText(this.redisNamespace)) { - sessionRepository.setRedisKeyNamespace(this.redisNamespace); + sessionRepository.setDefaultMaxInactiveInterval(Duration.ofSeconds(getMaxInactiveIntervalInSeconds())); + if (StringUtils.hasText(getRedisNamespace())) { + sessionRepository.setRedisKeyNamespace(getRedisNamespace()); } - sessionRepository.setFlushMode(this.flushMode); - sessionRepository.setSaveMode(this.saveMode); - this.sessionRepositoryCustomizers + sessionRepository.setFlushMode(getFlushMode()); + sessionRepository.setSaveMode(getSaveMode()); + getSessionRepositoryCustomizers() .forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository)); return sessionRepository; } - public void setMaxInactiveIntervalInSeconds(int maxInactiveIntervalInSeconds) { - this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; - } - - public void setRedisNamespace(String namespace) { - this.redisNamespace = namespace; - } - - public void setFlushMode(FlushMode flushMode) { - Assert.notNull(flushMode, "flushMode cannot be null"); - this.flushMode = flushMode; - } - - public void setSaveMode(SaveMode saveMode) { - this.saveMode = saveMode; - } - - @Autowired - public void setRedisConnectionFactory( - @SpringSessionRedisConnectionFactory ObjectProvider springSessionRedisConnectionFactory, - ObjectProvider redisConnectionFactory) { - RedisConnectionFactory redisConnectionFactoryToUse = springSessionRedisConnectionFactory.getIfAvailable(); - if (redisConnectionFactoryToUse == null) { - redisConnectionFactoryToUse = redisConnectionFactory.getObject(); - } - this.redisConnectionFactory = redisConnectionFactoryToUse; - } - - @Autowired(required = false) - @Qualifier("springSessionDefaultRedisSerializer") - public void setDefaultRedisSerializer(RedisSerializer defaultRedisSerializer) { - this.defaultRedisSerializer = defaultRedisSerializer; - } - - @Autowired(required = false) - public void setSessionRepositoryCustomizer( - ObjectProvider> sessionRepositoryCustomizers) { - this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList()); - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { this.embeddedValueResolver = resolver; @@ -150,26 +75,16 @@ public void setImportMetadata(AnnotationMetadata importMetadata) { Map attributeMap = importMetadata .getAnnotationAttributes(EnableRedisHttpSession.class.getName()); AnnotationAttributes attributes = AnnotationAttributes.fromMap(attributeMap); - this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); + if (attributes == null) { + return; + } + setMaxInactiveIntervalInSeconds(attributes.getNumber("maxInactiveIntervalInSeconds")); String redisNamespaceValue = attributes.getString("redisNamespace"); if (StringUtils.hasText(redisNamespaceValue)) { - this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue); - } - this.flushMode = attributes.getEnum("flushMode"); - this.saveMode = attributes.getEnum("saveMode"); - } - - private RedisTemplate createRedisTemplate() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - if (this.defaultRedisSerializer != null) { - redisTemplate.setDefaultSerializer(this.defaultRedisSerializer); + setRedisNamespace(this.embeddedValueResolver.resolveStringValue(redisNamespaceValue)); } - redisTemplate.setConnectionFactory(this.redisConnectionFactory); - redisTemplate.setBeanClassLoader(this.classLoader); - redisTemplate.afterPropertiesSet(); - return redisTemplate; + setFlushMode(attributes.getEnum("flushMode")); + setSaveMode(attributes.getEnum("saveMode")); } } diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationSelector.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationSelector.java deleted file mode 100644 index 704e26286..000000000 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationSelector.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2014-2022 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.data.redis.config.annotation.web.http; - -import org.springframework.context.annotation.ImportSelector; -import org.springframework.core.type.AnnotationMetadata; - -/** - * Dynamically determines which session repository configuration to include using the - * {@link EnableRedisHttpSession} annotation. - * - * @author Eleftheria Stein - * @since 3.0 - */ -final class RedisHttpSessionConfigurationSelector implements ImportSelector { - - @Override - public String[] selectImports(AnnotationMetadata importMetadata) { - if (!importMetadata.hasAnnotation(EnableRedisHttpSession.class.getName())) { - return new String[0]; - } - EnableRedisHttpSession annotation = importMetadata.getAnnotations().get(EnableRedisHttpSession.class) - .synthesize(); - if (annotation.enableIndexingAndEvents()) { - return new String[] { RedisIndexedHttpSessionConfiguration.class.getName() }; - } - else { - return new String[] { RedisHttpSessionConfiguration.class.getName() }; - } - } - -} diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfiguration.java index 67614d50b..1635c17ad 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfiguration.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfiguration.java @@ -18,16 +18,12 @@ import java.util.Arrays; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.concurrent.Executor; -import java.util.stream.Collectors; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationEventPublisher; @@ -45,92 +41,70 @@ import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; -import org.springframework.session.FlushMode; import org.springframework.session.IndexResolver; -import org.springframework.session.MapSession; -import org.springframework.session.SaveMode; import org.springframework.session.Session; -import org.springframework.session.config.SessionRepositoryCustomizer; -import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction; import org.springframework.session.data.redis.config.ConfigureRedisAction; -import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory; import org.springframework.session.web.http.SessionRepositoryFilter; -import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import org.springframework.util.StringValueResolver; /** * Exposes the {@link SessionRepositoryFilter} as a bean named - * {@code springSessionRepositoryFilter}. In order to use this a single - * {@link RedisConnectionFactory} must be exposed as a Bean. + * {@code springSessionRepositoryFilter} backed by {@link RedisIndexedSessionRepository}. + * In order to use this a single {@link RedisConnectionFactory} must be exposed as a Bean. * - * @author Eleftheria Stein - * @since 3.0 + * @author Vedran Pavic + * @since 3.0.0 + * @see EnableRedisIndexedHttpSession */ @Configuration(proxyBeanMethods = false) -public class RedisIndexedHttpSessionConfiguration extends SpringHttpSessionConfiguration - implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { +public class RedisIndexedHttpSessionConfiguration + extends AbstractRedisHttpSessionConfiguration + implements EmbeddedValueResolverAware, ImportAware { static final String DEFAULT_CLEANUP_CRON = "0 * * * * *"; - private Integer maxInactiveIntervalInSeconds = MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS; - - private String redisNamespace = RedisIndexedSessionRepository.DEFAULT_NAMESPACE; - - private FlushMode flushMode = FlushMode.ON_SAVE; - - private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE; - private String cleanupCron = DEFAULT_CLEANUP_CRON; private ConfigureRedisAction configureRedisAction = new ConfigureNotifyKeyspaceEventsAction(); - private RedisConnectionFactory redisConnectionFactory; - private IndexResolver indexResolver; - private RedisSerializer defaultRedisSerializer; - private ApplicationEventPublisher applicationEventPublisher; private Executor redisTaskExecutor; private Executor redisSubscriptionExecutor; - private List> sessionRepositoryCustomizers; - - private ClassLoader classLoader; - private StringValueResolver embeddedValueResolver; @Bean + @Override public RedisIndexedSessionRepository sessionRepository() { - RedisTemplate redisTemplate = createRedisTemplate(); + RedisTemplate redisTemplate = createRedisTemplate(); RedisIndexedSessionRepository sessionRepository = new RedisIndexedSessionRepository(redisTemplate); sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher); if (this.indexResolver != null) { sessionRepository.setIndexResolver(this.indexResolver); } - if (this.defaultRedisSerializer != null) { - sessionRepository.setDefaultSerializer(this.defaultRedisSerializer); + if (getDefaultRedisSerializer() != null) { + sessionRepository.setDefaultSerializer(getDefaultRedisSerializer()); } - sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds); - if (StringUtils.hasText(this.redisNamespace)) { - sessionRepository.setRedisKeyNamespace(this.redisNamespace); + sessionRepository.setDefaultMaxInactiveInterval(getMaxInactiveIntervalInSeconds()); + if (StringUtils.hasText(getRedisNamespace())) { + sessionRepository.setRedisKeyNamespace(getRedisNamespace()); } - sessionRepository.setFlushMode(this.flushMode); - sessionRepository.setSaveMode(this.saveMode); + sessionRepository.setFlushMode(getFlushMode()); + sessionRepository.setSaveMode(getSaveMode()); int database = resolveDatabase(); sessionRepository.setDatabase(database); - this.sessionRepositoryCustomizers + getSessionRepositoryCustomizers() .forEach((sessionRepositoryCustomizer) -> sessionRepositoryCustomizer.customize(sessionRepository)); return sessionRepository; } @@ -139,7 +113,7 @@ public RedisIndexedSessionRepository sessionRepository() { public RedisMessageListenerContainer springSessionRedisMessageListenerContainer( RedisIndexedSessionRepository sessionRepository) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); - container.setConnectionFactory(this.redisConnectionFactory); + container.setConnectionFactory(getRedisConnectionFactory()); if (this.redisTaskExecutor != null) { container.setTaskExecutor(this.redisTaskExecutor); } @@ -156,24 +130,7 @@ public RedisMessageListenerContainer springSessionRedisMessageListenerContainer( @Bean public InitializingBean enableRedisKeyspaceNotificationsInitializer() { - return new EnableRedisKeyspaceNotificationsInitializer(this.redisConnectionFactory, this.configureRedisAction); - } - - public void setMaxInactiveIntervalInSeconds(int maxInactiveIntervalInSeconds) { - this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; - } - - public void setRedisNamespace(String namespace) { - this.redisNamespace = namespace; - } - - public void setFlushMode(FlushMode flushMode) { - Assert.notNull(flushMode, "flushMode cannot be null"); - this.flushMode = flushMode; - } - - public void setSaveMode(SaveMode saveMode) { - this.saveMode = saveMode; + return new EnableRedisKeyspaceNotificationsInitializer(getRedisConnectionFactory(), this.configureRedisAction); } public void setCleanupCron(String cleanupCron) { @@ -190,23 +147,6 @@ public void setConfigureRedisAction(ConfigureRedisAction configureRedisAction) { this.configureRedisAction = configureRedisAction; } - @Autowired - public void setRedisConnectionFactory( - @SpringSessionRedisConnectionFactory ObjectProvider springSessionRedisConnectionFactory, - ObjectProvider redisConnectionFactory) { - RedisConnectionFactory redisConnectionFactoryToUse = springSessionRedisConnectionFactory.getIfAvailable(); - if (redisConnectionFactoryToUse == null) { - redisConnectionFactoryToUse = redisConnectionFactory.getObject(); - } - this.redisConnectionFactory = redisConnectionFactoryToUse; - } - - @Autowired(required = false) - @Qualifier("springSessionDefaultRedisSerializer") - public void setDefaultRedisSerializer(RedisSerializer defaultRedisSerializer) { - this.defaultRedisSerializer = defaultRedisSerializer; - } - @Autowired public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; @@ -229,17 +169,6 @@ public void setRedisSubscriptionExecutor(Executor redisSubscriptionExecutor) { this.redisSubscriptionExecutor = redisSubscriptionExecutor; } - @Autowired(required = false) - public void setSessionRepositoryCustomizer( - ObjectProvider> sessionRepositoryCustomizers) { - this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList()); - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { this.embeddedValueResolver = resolver; @@ -248,38 +177,32 @@ public void setEmbeddedValueResolver(StringValueResolver resolver) { @Override public void setImportMetadata(AnnotationMetadata importMetadata) { Map attributeMap = importMetadata - .getAnnotationAttributes(EnableRedisHttpSession.class.getName()); + .getAnnotationAttributes(EnableRedisIndexedHttpSession.class.getName()); AnnotationAttributes attributes = AnnotationAttributes.fromMap(attributeMap); - this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); + if (attributes == null) { + return; + } + setMaxInactiveIntervalInSeconds(attributes.getNumber("maxInactiveIntervalInSeconds")); String redisNamespaceValue = attributes.getString("redisNamespace"); if (StringUtils.hasText(redisNamespaceValue)) { - this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue); + setRedisNamespace(this.embeddedValueResolver.resolveStringValue(redisNamespaceValue)); } - this.flushMode = attributes.getEnum("flushMode"); - this.saveMode = attributes.getEnum("saveMode"); - } - - private RedisTemplate createRedisTemplate() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - if (this.defaultRedisSerializer != null) { - redisTemplate.setDefaultSerializer(this.defaultRedisSerializer); + setFlushMode(attributes.getEnum("flushMode")); + setSaveMode(attributes.getEnum("saveMode")); + String cleanupCron = attributes.getString("cleanupCron"); + if (StringUtils.hasText(cleanupCron)) { + setCleanupCron(cleanupCron); } - redisTemplate.setConnectionFactory(this.redisConnectionFactory); - redisTemplate.setBeanClassLoader(this.classLoader); - redisTemplate.afterPropertiesSet(); - return redisTemplate; } private int resolveDatabase() { if (ClassUtils.isPresent("io.lettuce.core.RedisClient", null) - && this.redisConnectionFactory instanceof LettuceConnectionFactory) { - return ((LettuceConnectionFactory) this.redisConnectionFactory).getDatabase(); + && getRedisConnectionFactory() instanceof LettuceConnectionFactory) { + return ((LettuceConnectionFactory) getRedisConnectionFactory()).getDatabase(); } if (ClassUtils.isPresent("redis.clients.jedis.Jedis", null) - && this.redisConnectionFactory instanceof JedisConnectionFactory) { - return ((JedisConnectionFactory) this.redisConnectionFactory).getDatabase(); + && getRedisConnectionFactory() instanceof JedisConnectionFactory) { + return ((JedisConnectionFactory) getRedisConnectionFactory()).getDatabase(); } return RedisIndexedSessionRepository.DEFAULT_DATABASE; } @@ -295,7 +218,7 @@ static class EnableRedisKeyspaceNotificationsInitializer implements Initializing private final RedisConnectionFactory connectionFactory; - private ConfigureRedisAction configure; + private final ConfigureRedisAction configure; EnableRedisKeyspaceNotificationsInitializer(RedisConnectionFactory connectionFactory, ConfigureRedisAction configure) { diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryTests.java index 07cd09d5f..5b6c22fa2 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisIndexedSessionRepositoryTests.java @@ -70,16 +70,16 @@ class RedisIndexedSessionRepositoryTests { @Mock - private RedisOperations redisOperations; + private RedisOperations redisOperations; @Mock - private BoundValueOperations boundValueOperations; + private BoundValueOperations boundValueOperations; @Mock - private BoundHashOperations boundHashOperations; + private BoundHashOperations boundHashOperations; @Mock - private BoundSetOperations boundSetOperations; + private BoundSetOperations boundSetOperations; @Mock private ApplicationEventPublisher publisher; @@ -116,7 +116,7 @@ void setApplicationEventPublisherNull() { @Test void changeSessionIdWhenNotSaved() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -133,7 +133,7 @@ void changeSessionIdWhenNotSaved() { @Test void changeSessionIdWhenSaved() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -166,7 +166,7 @@ void createSessionCustomMaxInactiveInterval() { @Test void saveNewSession() { RedisSession session = this.redisRepository.createSession(); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -201,7 +201,7 @@ void saveJavadocSummary() { .roundUpToNextMinute(RedisSessionExpirationPolicy.expiresInMillis(session)); String destroyedTriggerKey = "spring:session:sessions:expires:" + session.getId(); - given(this.redisOperations.boundHashOps(sessionKey)).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(sessionKey)).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(backgroundExpireKey)).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(destroyedTriggerKey)).willReturn(this.boundValueOperations); @@ -224,7 +224,7 @@ void saveJavadoc() { RedisSession session = this.redisRepository.new RedisSession(this.cached, false); session.setLastAccessedTime(session.getLastAccessedTime()); - given(this.redisOperations.boundHashOps("spring:session:sessions:session-id")) + given(this.redisOperations.boundHashOps("spring:session:sessions:session-id")) .willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps("spring:session:expirations:1404361860000")) .willReturn(this.boundSetOperations); @@ -245,7 +245,7 @@ void saveJavadoc() { void saveLastAccessChanged() { RedisSession session = this.redisRepository.new RedisSession(this.cached, false); session.setLastAccessedTime(Instant.ofEpochMilli(12345678L)); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -260,7 +260,7 @@ void saveSetAttribute() { String attrName = "attrName"; RedisSession session = this.redisRepository.new RedisSession(new MapSession(), false); session.setAttribute(attrName, "attrValue"); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -275,7 +275,7 @@ void saveRemoveAttribute() { String attrName = "attrName"; RedisSession session = this.redisRepository.new RedisSession(new MapSession(), false); session.removeAttribute(attrName); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -288,7 +288,7 @@ void saveRemoveAttribute() { void saveExpired() { RedisSession session = this.redisRepository.new RedisSession(new MapSession(), false); session.setMaxInactiveInterval(Duration.ZERO); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); this.redisRepository.save(session); @@ -316,7 +316,7 @@ void delete() { MapSession expected = new MapSession(); expected.setLastAccessedTime(Instant.now().minusSeconds(60)); expected.setAttribute(attrName, "attrValue"); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); Map map = map(RedisIndexedSessionRepository.getSessionAttrNameKey(attrName), expected.getAttribute(attrName), RedisSessionMapper.CREATION_TIME_KEY, expected.getCreationTime().toEpochMilli(), @@ -335,7 +335,7 @@ void delete() { @Test void deleteNullSession() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); String id = "abc"; this.redisRepository.deleteById(id); @@ -347,7 +347,7 @@ void deleteNullSession() { @SuppressWarnings("unchecked") void getSessionNotFound() { String id = "abc"; - given(this.redisOperations.boundHashOps(getKey(id))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(id))).willReturn(this.boundHashOperations); given(this.boundHashOperations.entries()).willReturn(map()); assertThat(this.redisRepository.findById(id)).isNull(); @@ -362,7 +362,8 @@ void getSessionFound() { expected.setLastAccessedTime(Instant.now().minusSeconds(60)); expected.setAttribute(attribute1, "test"); expected.setAttribute(attribute2, null); - given(this.redisOperations.boundHashOps(getKey(expected.getId()))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(expected.getId()))) + .willReturn(this.boundHashOperations); Map map = map(RedisIndexedSessionRepository.getSessionAttrNameKey(attribute1), expected.getAttribute(attribute1), RedisIndexedSessionRepository.getSessionAttrNameKey(attribute2), expected.getAttribute(attribute2), RedisSessionMapper.CREATION_TIME_KEY, @@ -387,7 +388,8 @@ void getSessionFound() { @SuppressWarnings("unchecked") void getSessionExpired() { String expiredId = "expired-id"; - given(this.redisOperations.boundHashOps(getKey(expiredId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(expiredId))) + .willReturn(this.boundHashOperations); Map map = map(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, 1, RedisSessionMapper.LAST_ACCESSED_TIME_KEY, Instant.now().minus(5, ChronoUnit.MINUTES).toEpochMilli()); given(this.boundHashOperations.entries()).willReturn(map); @@ -401,7 +403,8 @@ void findByPrincipalNameExpired() { String expiredId = "expired-id"; given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.boundSetOperations.members()).willReturn(Collections.singleton(expiredId)); - given(this.redisOperations.boundHashOps(getKey(expiredId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(expiredId))) + .willReturn(this.boundHashOperations); Map map = map(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, 1, RedisSessionMapper.LAST_ACCESSED_TIME_KEY, Instant.now().minus(5, ChronoUnit.MINUTES).toEpochMilli()); given(this.boundHashOperations.entries()).willReturn(map); @@ -420,7 +423,8 @@ void findByPrincipalName() { String sessionId = "some-id"; given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.boundSetOperations.members()).willReturn(Collections.singleton(sessionId)); - given(this.redisOperations.boundHashOps(getKey(sessionId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(sessionId))) + .willReturn(this.boundHashOperations); Map map = map(RedisSessionMapper.CREATION_TIME_KEY, createdTime.toEpochMilli(), RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, (int) maxInactive.getSeconds(), RedisSessionMapper.LAST_ACCESSED_TIME_KEY, lastAccessed.toEpochMilli()); @@ -495,7 +499,8 @@ void onMessageCreatedCustomSerializer() { @SuppressWarnings("unchecked") void onMessageDeletedSessionFound() { String deletedId = "deleted-id"; - given(this.redisOperations.boundHashOps(getKey(deletedId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(deletedId))) + .willReturn(this.boundHashOperations); Map map = map(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, 0, RedisSessionMapper.LAST_ACCESSED_TIME_KEY, System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5)); given(this.boundHashOperations.entries()).willReturn(map); @@ -522,7 +527,8 @@ void onMessageDeletedSessionFound() { @SuppressWarnings("unchecked") void onMessageDeletedSessionNotFound() { String deletedId = "deleted-id"; - given(this.redisOperations.boundHashOps(getKey(deletedId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(deletedId))) + .willReturn(this.boundHashOperations); given(this.boundHashOperations.entries()).willReturn(map()); String channel = "__keyevent@0__:del"; @@ -545,7 +551,8 @@ void onMessageDeletedSessionNotFound() { @SuppressWarnings("unchecked") void onMessageExpiredSessionFound() { String expiredId = "expired-id"; - given(this.redisOperations.boundHashOps(getKey(expiredId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(expiredId))) + .willReturn(this.boundHashOperations); Map map = map(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, 1, RedisSessionMapper.LAST_ACCESSED_TIME_KEY, System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5)); given(this.boundHashOperations.entries()).willReturn(map); @@ -572,7 +579,8 @@ void onMessageExpiredSessionFound() { @SuppressWarnings("unchecked") void onMessageExpiredSessionNotFound() { String expiredId = "expired-id"; - given(this.redisOperations.boundHashOps(getKey(expiredId))).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(getKey(expiredId))) + .willReturn(this.boundHashOperations); given(this.boundHashOperations.entries()).willReturn(map()); String channel = "__keyevent@0__:expired"; @@ -632,7 +640,7 @@ void flushModeOnSaveSetMaxInactiveIntervalInSeconds() { @Test void flushModeImmediateCreate() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -651,7 +659,7 @@ void flushModeImmediateCreate() { @Test // gh-1409 void flushModeImmediateCreateWithCustomMaxInactiveInterval() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); this.redisRepository.setDefaultMaxInactiveInterval(60); @@ -664,7 +672,7 @@ void flushModeImmediateCreateWithCustomMaxInactiveInterval() { @Test void flushModeImmediateSetAttribute() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -681,7 +689,7 @@ void flushModeImmediateSetAttribute() { @Test void flushModeImmediateRemoveAttribute() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -699,7 +707,7 @@ void flushModeImmediateRemoveAttribute() { @Test @SuppressWarnings("unchecked") void flushModeSetMaxInactiveIntervalInSeconds() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -715,7 +723,7 @@ void flushModeSetMaxInactiveIntervalInSeconds() { @Test void flushModeSetLastAccessedTime() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); @@ -742,7 +750,7 @@ void changeRedisNamespace() { this.redisRepository.setRedisKeyNamespace(namespace); RedisSession session = this.redisRepository.new RedisSession(new MapSession(), false); session.setMaxInactiveInterval(Duration.ZERO); - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); this.redisRepository.save(session); @@ -832,7 +840,7 @@ void onMessageExpiredInOtherDatabase() { @Test void saveWithSaveModeOnSetAttribute() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); this.redisRepository.setSaveMode(SaveMode.ON_SET_ATTRIBUTE); @@ -849,7 +857,7 @@ void saveWithSaveModeOnSetAttribute() { @Test void saveWithSaveModeOnGetAttribute() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); this.redisRepository.setSaveMode(SaveMode.ON_GET_ATTRIBUTE); @@ -866,7 +874,7 @@ void saveWithSaveModeOnGetAttribute() { @Test void saveWithSaveModeAlways() { - given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); + given(this.redisOperations.boundHashOps(anyString())).willReturn(this.boundHashOperations); given(this.redisOperations.boundSetOps(anyString())).willReturn(this.boundSetOperations); given(this.redisOperations.boundValueOps(anyString())).willReturn(this.boundValueOperations); this.redisRepository.setSaveMode(SaveMode.ALWAYS); diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java index c9d57c7e7..af4719684 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java @@ -50,16 +50,16 @@ class RedisSessionExpirationPolicyTests { private static final Long ONE_MINUTE_AGO = 1429111652346L; @Mock(lenient = true) - RedisOperations sessionRedisOperations; + RedisOperations sessionRedisOperations; @Mock - BoundSetOperations setOperations; + BoundSetOperations setOperations; @Mock - BoundHashOperations hashOperations; + BoundHashOperations hashOperations; @Mock - BoundValueOperations valueOperations; + BoundValueOperations valueOperations; private RedisSessionExpirationPolicy policy; diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java similarity index 89% rename from spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java rename to spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java index d2a924045..1eca91b0c 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -58,9 +57,9 @@ * @author Mark Paluch * @author Vedran Pavic */ -class RedisHttpSessionConfigurationTests { +class RedisHttpsSessionConfigurationTests { - private static final Duration MAX_INACTIVE_INTERVAL_DURATION = Duration.ofSeconds(600); + private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; private AnnotationConfigApplicationContext context; @@ -116,13 +115,6 @@ void customSaveModeAnnotation() { SaveMode.ALWAYS); } - @Test - void customSaveModeSetter() { - registerAndRefresh(RedisConfig.class, CustomSaveModeExpressionSetterConfiguration.class); - assertThat(this.context.getBean(RedisSessionRepository.class)).hasFieldOrPropertyWithValue("saveMode", - SaveMode.ALWAYS); - } - @Test void qualifiedConnectionFactoryRedisConfig() { registerAndRefresh(RedisConfig.class, QualifiedConnectionFactoryRedisConfig.class); @@ -132,8 +124,9 @@ void qualifiedConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -148,8 +141,9 @@ void primaryConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -164,8 +158,9 @@ void qualifiedAndPrimaryConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -180,8 +175,9 @@ void namedConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -191,8 +187,7 @@ void namedConnectionFactoryRedisConfig() { void multipleConnectionFactoryRedisConfig() { assertThatExceptionOfType(BeanCreationException.class) .isThrownBy(() -> registerAndRefresh(RedisConfig.class, MultipleConnectionFactoryRedisConfig.class)) - .withCauseInstanceOf(NoUniqueBeanDefinitionException.class).havingCause() - .withMessageContaining("expected single matching bean but found 2"); + .havingRootCause().withMessageContaining("expected single matching bean but found 2"); } @Test @@ -200,7 +195,7 @@ void sessionRepositoryCustomizer() { registerAndRefresh(RedisConfig.class, SessionRepositoryCustomizerConfiguration.class); RedisSessionRepository sessionRepository = this.context.getBean(RedisSessionRepository.class); assertThat(sessionRepository).hasFieldOrPropertyWithValue("defaultMaxInactiveInterval", - MAX_INACTIVE_INTERVAL_DURATION); + Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS)); } private void registerAndRefresh(Class... annotatedClasses) { @@ -271,15 +266,6 @@ static class CustomSaveModeExpressionAnnotationConfiguration { } - @Configuration - static class CustomSaveModeExpressionSetterConfiguration extends RedisHttpSessionConfiguration { - - CustomSaveModeExpressionSetterConfiguration() { - setSaveMode(SaveMode.ALWAYS); - } - - } - @Configuration @EnableRedisHttpSession static class QualifiedConnectionFactoryRedisConfig { @@ -369,7 +355,7 @@ SessionRepositoryCustomizer sessionRepositoryCustomizerO @Order(1) SessionRepositoryCustomizer sessionRepositoryCustomizerTwo() { return (sessionRepository) -> sessionRepository - .setDefaultMaxInactiveInterval(MAX_INACTIVE_INTERVAL_DURATION); + .setDefaultMaxInactiveInterval(Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS)); } } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationNoOpConfigureRedisActionTests.java similarity index 96% rename from spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java rename to spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationNoOpConfigureRedisActionTests.java index 280978a60..30c9b0d60 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationNoOpConfigureRedisActionTests.java @@ -40,13 +40,13 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration @WebAppConfiguration -class RedisHttpSessionConfigurationNoOpConfigureRedisActionTests { +class RedisIndexedHttpSessionConfigurationNoOpConfigureRedisActionTests { @Test void redisConnectionFactoryNotUsedSinceNoValidation() { } - @EnableRedisHttpSession + @EnableRedisIndexedHttpSession @Configuration static class Config { diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutor.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutor.java index 1c346bd61..07b727efa 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutor.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutor.java @@ -62,8 +62,8 @@ void overrideSessionTaskExecutor() { verify(this.springSessionRedisTaskExecutor, times(1)).execute(any(Runnable.class)); } - @EnableRedisHttpSession(enableIndexingAndEvents = true) @Configuration + @EnableRedisIndexedHttpSession static class Config { @Bean diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutors.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutors.java index 50afca014..eebb360d7 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutors.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationOverrideSessionTaskExecutors.java @@ -68,8 +68,8 @@ void overrideSessionTaskExecutors() { verify(this.springSessionRedisTaskExecutor, never()).execute(any(Runnable.class)); } - @EnableRedisHttpSession(enableIndexingAndEvents = true) @Configuration + @EnableRedisIndexedHttpSession static class Config { @Bean diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java index 7c9833c12..fca38d7f2 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -56,6 +55,8 @@ /** * Tests for {@link RedisIndexedHttpSessionConfiguration}. + * + * @author Vedran Pavic */ class RedisIndexedHttpSessionConfigurationTests { @@ -113,8 +114,8 @@ void setCustomFlushImmediately() { } @Test - void customCleanupCronSetter() { - registerAndRefresh(RedisConfig.class, CustomCleanupCronExpressionSetterConfiguration.class); + void customCleanupCronAnnotation() { + registerAndRefresh(RedisConfig.class, CustomCleanupCronExpressionAnnotationConfiguration.class); RedisIndexedHttpSessionConfiguration configuration = this.context .getBean(RedisIndexedHttpSessionConfiguration.class); @@ -129,13 +130,6 @@ void customSaveModeAnnotation() { SaveMode.ALWAYS); } - @Test - void customSaveModeSetter() { - registerAndRefresh(RedisConfig.class, CustomSaveModeExpressionSetterConfiguration.class); - assertThat(this.context.getBean(RedisIndexedSessionRepository.class)).hasFieldOrPropertyWithValue("saveMode", - SaveMode.ALWAYS); - } - @Test void qualifiedConnectionFactoryRedisConfig() { registerAndRefresh(RedisConfig.class, QualifiedConnectionFactoryRedisConfig.class); @@ -145,8 +139,9 @@ void qualifiedConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -161,8 +156,9 @@ void primaryConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -177,8 +173,9 @@ void qualifiedAndPrimaryConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -193,8 +190,9 @@ void namedConnectionFactoryRedisConfig() { RedisConnectionFactory.class); assertThat(repository).isNotNull(); assertThat(redisConnectionFactory).isNotNull(); - RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils.getField(repository, - "sessionRedisOperations"); + @SuppressWarnings("unchecked") + RedisOperations redisOperations = (RedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); assertThat(redisOperations).isNotNull(); assertThat(ReflectionTestUtils.getField(redisOperations, "connectionFactory")) .isEqualTo(redisConnectionFactory); @@ -204,8 +202,7 @@ void namedConnectionFactoryRedisConfig() { void multipleConnectionFactoryRedisConfig() { assertThatExceptionOfType(BeanCreationException.class) .isThrownBy(() -> registerAndRefresh(RedisConfig.class, MultipleConnectionFactoryRedisConfig.class)) - .withRootCauseInstanceOf(NoUniqueBeanDefinitionException.class).havingRootCause() - .withMessageContaining("expected single matching bean but found 2"); + .havingRootCause().withMessageContaining("expected single matching bean but found 2"); } @Test @@ -294,36 +291,23 @@ static class CustomFlushImmediatelySetConfiguration extends RedisIndexedHttpSess } @Configuration - @EnableRedisHttpSession(flushMode = FlushMode.IMMEDIATE, enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(flushMode = FlushMode.IMMEDIATE) static class CustomFlushImmediatelyConfiguration { } - @Configuration - static class CustomCleanupCronExpressionSetterConfiguration extends RedisIndexedHttpSessionConfiguration { - - CustomCleanupCronExpressionSetterConfiguration() { - setCleanupCron(CLEANUP_CRON_EXPRESSION); - } + @EnableRedisIndexedHttpSession(cleanupCron = CLEANUP_CRON_EXPRESSION) + static class CustomCleanupCronExpressionAnnotationConfiguration { } - @EnableRedisHttpSession(saveMode = SaveMode.ALWAYS, enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(saveMode = SaveMode.ALWAYS) static class CustomSaveModeExpressionAnnotationConfiguration { } @Configuration - static class CustomSaveModeExpressionSetterConfiguration extends RedisIndexedHttpSessionConfiguration { - - CustomSaveModeExpressionSetterConfiguration() { - setSaveMode(SaveMode.ALWAYS); - } - - } - - @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class QualifiedConnectionFactoryRedisConfig { @Bean @@ -335,7 +319,7 @@ RedisConnectionFactory qualifiedRedisConnectionFactory() { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class PrimaryConnectionFactoryRedisConfig { @Bean @@ -347,7 +331,7 @@ RedisConnectionFactory primaryRedisConnectionFactory() { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class QualifiedAndPrimaryConnectionFactoryRedisConfig { @Bean @@ -365,7 +349,7 @@ RedisConnectionFactory primaryRedisConnectionFactory() { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class NamedConnectionFactoryRedisConfig { @Bean @@ -376,7 +360,7 @@ RedisConnectionFactory redisConnectionFactory() { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class MultipleConnectionFactoryRedisConfig { @Bean @@ -387,19 +371,19 @@ RedisConnectionFactory secondaryRedisConnectionFactory() { } @Configuration - @EnableRedisHttpSession(redisNamespace = "myRedisNamespace", enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(redisNamespace = "myRedisNamespace") static class CustomRedisHttpSessionConfiguration { } @Configuration - @EnableRedisHttpSession(redisNamespace = "${session.redis.namespace}", enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession(redisNamespace = "${session.redis.namespace}") static class CustomRedisHttpSessionConfiguration2 { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class CustomIndexResolverConfiguration { @Bean @@ -411,7 +395,7 @@ IndexResolver indexResolver() { } @Configuration - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class CustomRedisMessageListenerContainerConfig { @Bean @@ -421,7 +405,7 @@ RedisMessageListenerContainer redisMessageListenerContainer() { } - @EnableRedisHttpSession(enableIndexingAndEvents = true) + @EnableRedisIndexedHttpSession static class SessionRepositoryCustomizerConfiguration { @Bean diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java index 26797615e..aba58ee80 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java @@ -66,7 +66,7 @@ static class Config extends RedisHttpSessionConfiguration { * override sessionRepository construction to set the custom session-timeout */ @Bean - RedisIndexedSessionRepository sessionRepository(RedisOperations sessionRedisTemplate, + RedisIndexedSessionRepository sessionRepository(RedisOperations sessionRedisTemplate, ApplicationEventPublisher applicationEventPublisher) { RedisIndexedSessionRepository sessionRepository = new RedisIndexedSessionRepository(sessionRedisTemplate); sessionRepository.setDefaultMaxInactiveInterval(this.sessionTimeout); diff --git a/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests-context.xml b/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests-context.xml index f60708c62..efa78fb6c 100644 --- a/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests-context.xml +++ b/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests-context.xml @@ -7,7 +7,7 @@ - + diff --git a/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests-context.xml b/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests-context.xml index 8a3d6aa5a..ad70969aa 100644 --- a/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests-context.xml +++ b/spring-session-data-redis/src/test/resources/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests-context.xml @@ -8,7 +8,7 @@ - - + diff --git a/spring-session-docs/modules/ROOT/examples/java/docs/IndexDocTests.java b/spring-session-docs/modules/ROOT/examples/java/docs/IndexDocTests.java index 1e96061ee..3326c1aea 100644 --- a/spring-session-docs/modules/ROOT/examples/java/docs/IndexDocTests.java +++ b/spring-session-docs/modules/ROOT/examples/java/docs/IndexDocTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -130,7 +130,7 @@ void newRedisSessionRepository() { @SuppressWarnings("unused") void newRedisIndexedSessionRepository() { // tag::new-redisindexedsessionrepository[] - RedisTemplate redisTemplate = new RedisTemplate<>(); + RedisTemplate redisTemplate = new RedisTemplate<>(); // ... configure redisTemplate ... diff --git a/spring-session-docs/modules/ROOT/examples/resources/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests-context.xml b/spring-session-docs/modules/ROOT/examples/resources/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests-context.xml index 631a86dd4..654186f63 100644 --- a/spring-session-docs/modules/ROOT/examples/resources/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests-context.xml +++ b/spring-session-docs/modules/ROOT/examples/resources/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests-context.xml @@ -10,7 +10,7 @@ - + cookies = getDriver().manage().getCookies(); - assertThat(cookies).extracting("name").contains(cookieName); - } - - public void doesNotContainCookie(String cookieName) { - Set cookies = getDriver().manage().getCookies(); - assertThat(cookies).extracting("name").doesNotContain(cookieName); - } - - public HomePage logout() { - WebElement logout = getDriver().findElement(By.cssSelector("input[type=\"submit\"]")); - logout.click(); - return PageFactory.initElements(getDriver(), HomePage.class); - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/java/sample/pages/LoginPage.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/java/sample/pages/LoginPage.java deleted file mode 100644 index e72bba1eb..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/java/sample/pages/LoginPage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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 sample.pages; - -import org.openqa.selenium.SearchContext; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.FindBy; -import org.openqa.selenium.support.PageFactory; -import org.openqa.selenium.support.pagefactory.DefaultElementLocatorFactory; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LoginPage extends BasePage { - - public LoginPage(WebDriver driver) { - super(driver); - } - - public void assertAt() { - assertThat(getDriver().getTitle()).isEqualTo("Please sign in"); - } - - public Form form() { - return new Form(getDriver()); - } - - public class Form { - - @FindBy(name = "username") - private WebElement username; - - @FindBy(name = "password") - private WebElement password; - - @FindBy(tagName = "button") - private WebElement button; - - public Form(SearchContext context) { - PageFactory.initElements(new DefaultElementLocatorFactory(context), this); - } - - public T login(Class page) { - this.username.sendKeys("user"); - this.password.sendKeys("password"); - this.button.click(); - return PageFactory.initElements(getDriver(), page); - } - - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/resources/testcontainers.properties b/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/resources/testcontainers.properties deleted file mode 100644 index e3e834192..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/integration-test/resources/testcontainers.properties +++ /dev/null @@ -1 +0,0 @@ -ryuk.container.timeout=120 diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/Application.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/Application.java deleted file mode 100644 index e9c3db94f..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/Application.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 sample; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/IndexController.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/IndexController.java deleted file mode 100644 index 25418e262..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/IndexController.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2014-2022 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 sample; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * An index controller. - * - * @author Rob Winch - */ -@Controller -public class IndexController { - - @GetMapping("/") - String index() { - return "index"; - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/UserControllerAdvise.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/UserControllerAdvise.java deleted file mode 100644 index c7df27e84..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/UserControllerAdvise.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014-2022 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 sample; - -import java.security.Principal; - -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ModelAttribute; - -/** - * {@link ControllerAdvice} to expose user related attributes. - * - * @author Rob Winch - */ -@ControllerAdvice -public class UserControllerAdvise { - - @ModelAttribute("currentUserName") - String currentUser(Principal principal) { - return (principal != null) ? principal.getName() : null; - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SecurityConfig.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SecurityConfig.java deleted file mode 100644 index 66e93ea8f..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SecurityConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2014-2022 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 sample.config; - -import org.springframework.boot.autoconfigure.security.servlet.PathRequest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@Configuration -public class SecurityConfig { - - // @formatter:off - @Bean - SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - return http - .authorizeRequests((authorize) -> authorize - .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() - .anyRequest().authenticated() - ) - .formLogin((formLogin) -> formLogin - .permitAll() - ) - .build(); - } - // @formatter:on - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SessionConfig.java b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SessionConfig.java deleted file mode 100644 index aa2eb6dce..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/java/sample/config/SessionConfig.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2014-2022 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 sample.config; - -import java.time.Duration; - -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.session.RedisSessionProperties; -import org.springframework.boot.autoconfigure.session.SessionProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; -import org.springframework.session.data.redis.RedisSessionRepository; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(RedisSessionProperties.class) -@EnableSpringHttpSession -public class SessionConfig { - - private final SessionProperties sessionProperties; - - private final RedisSessionProperties redisSessionProperties; - - private final RedisConnectionFactory redisConnectionFactory; - - public SessionConfig(SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties, - ObjectProvider redisConnectionFactory) { - this.sessionProperties = sessionProperties; - this.redisSessionProperties = redisSessionProperties; - this.redisConnectionFactory = redisConnectionFactory.getObject(); - } - - @Bean - public RedisOperations sessionRedisOperations() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(this.redisConnectionFactory); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - return redisTemplate; - } - - @Bean - public RedisSessionRepository sessionRepository(RedisOperations sessionRedisOperations) { - RedisSessionRepository sessionRepository = new RedisSessionRepository(sessionRedisOperations); - Duration timeout = this.sessionProperties.getTimeout(); - if (timeout != null) { - sessionRepository.setDefaultMaxInactiveInterval(timeout); - } - sessionRepository.setRedisKeyNamespace(this.redisSessionProperties.getNamespace()); - sessionRepository.setFlushMode(this.redisSessionProperties.getFlushMode()); - sessionRepository.setSaveMode(this.redisSessionProperties.getSaveMode()); - return sessionRepository; - } - -} diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/application.properties b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/application.properties deleted file mode 100644 index 1b5271b53..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.security.user.password=password diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/favicon.ico b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/favicon.ico deleted file mode 100644 index bfb997401..000000000 Binary files a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/favicon.ico and /dev/null differ diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/images/logo.png b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/images/logo.png deleted file mode 100644 index 393230883..000000000 Binary files a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/static/images/logo.png and /dev/null differ diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/index.html b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/index.html deleted file mode 100644 index 769c73c26..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - Secured Content - - -
-

Secured Page

-

This page is secured using Spring Boot, Spring Session, and Spring Security.

-
- - diff --git a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/layout.html b/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/layout.html deleted file mode 100644 index 140c16e00..000000000 --- a/spring-session-samples/spring-session-sample-boot-redis-simple/src/main/resources/templates/layout.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - Spring Session Sample - - - - - - - - - - - -
- - -
-
- Some Success message -
-
- Fake content -
-
- -
-
- - - -