From 8bd29c1ab2f2abd71edb9d46c71ae15779675b3d Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Mon, 16 Nov 2015 16:12:35 -0600 Subject: [PATCH] HttpSessionListener sessionCreated id contains invalid ':' Fixes gh-305 --- .../RedisOperationsSessionRepository.java | 2 +- ...RedisOperationsSessionRepositoryTests.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java b/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java index a41f78f..c838469 100644 --- a/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java +++ b/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java @@ -486,7 +486,7 @@ public class RedisOperationsSessionRepository implements FindByPrincipalNameSess } public void handleCreated(Map loaded, String channel) { - String id = channel.substring(channel.lastIndexOf(":")); + String id = channel.substring(channel.lastIndexOf(":") + 1); ExpiringSession session = loadSession(id, loaded); publishEvent(new SessionCreatedEvent(this, session)); } diff --git a/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java b/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java index 9dbd0cc..603a487 100644 --- a/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java +++ b/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java @@ -16,8 +16,12 @@ package org.springframework.session.data.redis; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.*; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.CREATION_TIME_ATTR; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.LAST_ACCESSED_ATTR; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.MAX_INACTIVE_ATTR; @@ -38,15 +42,19 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.redis.connection.DefaultMessage; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.BoundValueOperations; import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.session.ExpiringSession; import org.springframework.session.MapSession; import org.springframework.session.data.redis.RedisOperationsSessionRepository.RedisSession; +import org.springframework.session.events.AbstractSessionEvent; @RunWith(MockitoJUnitRunner.class) @@ -64,6 +72,10 @@ public class RedisOperationsSessionRepositoryTests { BoundHashOperations boundHashOperations; @Mock BoundSetOperations boundSetOperations; + @Mock + ApplicationEventPublisher publisher; + @Captor + ArgumentCaptor event; @Captor ArgumentCaptor> delta; @@ -71,6 +83,7 @@ public class RedisOperationsSessionRepositoryTests { private RedisOperationsSessionRepository redisRepository; + @Before public void setup() { this.redisRepository = new RedisOperationsSessionRepository(redisOperations); @@ -380,6 +393,22 @@ public class RedisOperationsSessionRepositoryTests { } } + @Test + public void onMessageCreated() throws Exception { + MapSession session = cached; + byte[] pattern = "".getBytes("UTF-8"); + String channel = "spring:session:event:created:" + session.getId(); + byte[] body = new JdkSerializationRedisSerializer().serialize(new HashMap()); + DefaultMessage message = new DefaultMessage(channel.getBytes("UTF-8"), body); + + redisRepository.setApplicationEventPublisher(publisher); + + redisRepository.onMessage(message, pattern); + + verify(publisher).publishEvent(event.capture()); + assertThat(event.getValue().getSessionId()).isEqualTo(session.getId()); + } + private String getKey(String id) { return "spring:session:sessions:" + id; }