From 3c0449eda7d426a879a10f6121d3c214525c54aa Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 19 Jul 2017 12:41:45 +0300 Subject: [PATCH] Fixed - Tomcat RedissonSessionManager doesn't remove session on invalidation/expiration. #972 --- .../tomcat/RedissonSessionManagerTest.java | 15 ++++++++++++++- .../java/org/redisson/tomcat/RedissonSession.java | 5 +++++ .../redisson/tomcat/RedissonSessionManager.java | 8 +++++--- .../tomcat/RedissonSessionManagerTest.java | 13 +++++++++++++ .../java/org/redisson/tomcat/RedissonSession.java | 6 +++++- .../redisson/tomcat/RedissonSessionManager.java | 8 +++++--- .../tomcat/RedissonSessionManagerTest.java | 13 +++++++++++++ .../java/org/redisson/tomcat/TomcatServer.java | 2 +- 8 files changed, 61 insertions(+), 9 deletions(-) diff --git a/redisson-tomcat/redisson-tomcat-6/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java b/redisson-tomcat/redisson-tomcat-6/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java index dd8703be4..1978b9201 100644 --- a/redisson-tomcat/redisson-tomcat-6/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java +++ b/redisson-tomcat/redisson-tomcat-6/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java @@ -1,6 +1,8 @@ package org.redisson.tomcat; +import java.io.File; import java.io.IOException; +import java.nio.file.Paths; import org.apache.catalina.LifecycleException; import org.apache.http.client.ClientProtocolException; @@ -10,6 +12,9 @@ import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.BasicCookieStore; import org.junit.Assert; import org.junit.Test; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; public class RedissonSessionManagerTest { @@ -95,7 +100,12 @@ public class RedissonSessionManagerTest { @Test - public void testInvalidate() throws LifecycleException, InterruptedException, ClientProtocolException, IOException { + public void testInvalidate() throws Exception { + File f = Paths.get("").toAbsolutePath().resolve("src/test/webapp/WEB-INF/redisson.yaml").toFile(); + Config config = Config.fromYAML(f); + RedissonClient r = Redisson.create(config); + r.getKeys().flushall(); + // start the server at http://localhost:8080/myapp TomcatServer server = new TomcatServer("myapp", 8080, "/src/test/"); server.start(); @@ -115,9 +125,12 @@ public class RedissonSessionManagerTest { cookieStore.addCookie(cookie); executor.use(cookieStore); read(executor, "test", "null"); + invalidate(executor); Executor.closeIdleConnections(); server.stop(); + + Assert.assertEquals(0, r.getKeys().count()); } private void write(Executor executor, String key, String value) throws IOException, ClientProtocolException { diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java index 31db2671f..5c90fd02e 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -56,6 +56,11 @@ public class RedissonSession extends StandardSession { map = redissonManager.getMap(id); } + public void delete() { + map.delete(); + map = null; + } + @Override public void setCreationTime(long time) { super.setCreationTime(time); diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 910863228..21c7cf3b3 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -106,10 +106,12 @@ public class RedissonSessionManager extends ManagerBase { } @Override - public void remove(Session session) { - super.remove(session); + public void remove(Session session, boolean update) { + super.remove(session, update); - getMap(session.getId()).delete(); + if (session.getIdInternal() != null) { + ((RedissonSession)session).delete(); + } } public RedissonClient getRedisson() { diff --git a/redisson-tomcat/redisson-tomcat-7/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java b/redisson-tomcat/redisson-tomcat-7/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java index 2d260c587..d97fbcf2a 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java +++ b/redisson-tomcat/redisson-tomcat-7/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java @@ -1,6 +1,8 @@ package org.redisson.tomcat; +import java.io.File; import java.io.IOException; +import java.nio.file.Paths; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.fluent.Executor; @@ -9,6 +11,9 @@ import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.BasicCookieStore; import org.junit.Assert; import org.junit.Test; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; public class RedissonSessionManagerTest { @@ -95,6 +100,11 @@ public class RedissonSessionManagerTest { @Test public void testInvalidate() throws Exception { + File f = Paths.get("").toAbsolutePath().resolve("src/test/webapp/WEB-INF/redisson.yaml").toFile(); + Config config = Config.fromYAML(f); + RedissonClient r = Redisson.create(config); + r.getKeys().flushall(); + // start the server at http://localhost:8080/myapp TomcatServer server = new TomcatServer("myapp", 8080, "src/test/"); server.start(); @@ -114,9 +124,12 @@ public class RedissonSessionManagerTest { cookieStore.addCookie(cookie); executor.use(cookieStore); read(executor, "test", "null"); + invalidate(executor); Executor.closeIdleConnections(); server.stop(); + + Assert.assertEquals(0, r.getKeys().count()); } private void write(Executor executor, String key, String value) throws IOException, ClientProtocolException { diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java index a8981b95b..5c90fd02e 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -40,7 +40,6 @@ public class RedissonSession extends StandardSession { public RedissonSession(RedissonSessionManager manager) { super(manager); this.redissonManager = manager; - try { Field attr = StandardSession.class.getDeclaredField("attributes"); attrs = (Map) attr.get(this); @@ -57,6 +56,11 @@ public class RedissonSession extends StandardSession { map = redissonManager.getMap(id); } + public void delete() { + map.delete(); + map = null; + } + @Override public void setCreationTime(long time) { super.setCreationTime(time); diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 786a8b725..df588284b 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -105,10 +105,12 @@ public class RedissonSessionManager extends ManagerBase { } @Override - public void remove(Session session) { - super.remove(session); + public void remove(Session session, boolean update) { + super.remove(session, update); - getMap(session.getId()).delete(); + if (session.getIdInternal() != null) { + ((RedissonSession)session).delete(); + } } public RedissonClient getRedisson() { diff --git a/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java b/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java index 2d260c587..d97fbcf2a 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java +++ b/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/RedissonSessionManagerTest.java @@ -1,6 +1,8 @@ package org.redisson.tomcat; +import java.io.File; import java.io.IOException; +import java.nio.file.Paths; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.fluent.Executor; @@ -9,6 +11,9 @@ import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.BasicCookieStore; import org.junit.Assert; import org.junit.Test; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; public class RedissonSessionManagerTest { @@ -95,6 +100,11 @@ public class RedissonSessionManagerTest { @Test public void testInvalidate() throws Exception { + File f = Paths.get("").toAbsolutePath().resolve("src/test/webapp/WEB-INF/redisson.yaml").toFile(); + Config config = Config.fromYAML(f); + RedissonClient r = Redisson.create(config); + r.getKeys().flushall(); + // start the server at http://localhost:8080/myapp TomcatServer server = new TomcatServer("myapp", 8080, "src/test/"); server.start(); @@ -114,9 +124,12 @@ public class RedissonSessionManagerTest { cookieStore.addCookie(cookie); executor.use(cookieStore); read(executor, "test", "null"); + invalidate(executor); Executor.closeIdleConnections(); server.stop(); + + Assert.assertEquals(0, r.getKeys().count()); } private void write(Executor executor, String key, String value) throws IOException, ClientProtocolException { diff --git a/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/TomcatServer.java b/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/TomcatServer.java index 6ec7af3b6..fa5aca7f9 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/TomcatServer.java +++ b/redisson-tomcat/redisson-tomcat-8/src/test/java/org/redisson/tomcat/TomcatServer.java @@ -28,7 +28,7 @@ public class TomcatServer { tomcat.setBaseDir("."); // location where temp dir is created tomcat.setPort(port); - tomcat.getHost().setAppBase("."); + tomcat.getHost().setAppBase(appBase); tomcat.addWebapp(contextPath, appBase + "webapp"); }