From c281910669c305ca8b371e28f693d0680d68934a Mon Sep 17 00:00:00 2001 From: Zhelyazko Chobantonov Date: Tue, 30 Apr 2019 10:40:24 -0400 Subject: [PATCH] UpdateValve needs to execute manager.store only once at the end of the request #2084 --- .../java/org/redisson/tomcat/UpdateValve.java | 24 ++++++++++++------- .../java/org/redisson/tomcat/UpdateValve.java | 24 ++++++++++++------- .../java/org/redisson/tomcat/UpdateValve.java | 24 ++++++++++++------- .../java/org/redisson/tomcat/UpdateValve.java | 24 ++++++++++++------- 4 files changed, 64 insertions(+), 32 deletions(-) diff --git a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/UpdateValve.java b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/UpdateValve.java index 14b092997..26d4a82ad 100644 --- a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/UpdateValve.java +++ b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/UpdateValve.java @@ -31,6 +31,7 @@ import org.apache.catalina.valves.ValveBase; */ public class UpdateValve extends ValveBase { + private static final String ALREADY_FILTERED_NOTE = UpdateValve.class.getName() + ".ALREADY_FILTERED_NOTE"; private final RedissonSessionManager manager; public UpdateValve(RedissonSessionManager manager) { @@ -40,17 +41,24 @@ public class UpdateValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { - try { - getNext().invoke(request, response); - } finally { - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + //check if we already filtered/processed this request + if (request.getNote(ALREADY_FILTERED_NOTE) == null) { + request.setNote(ALREADY_FILTERED_NOTE, Boolean.TRUE); try { - ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); - Thread.currentThread().setContextClassLoader(applicationClassLoader); - manager.store(request.getSession(false)); + getNext().invoke(request, response); } finally { - Thread.currentThread().setContextClassLoader(classLoader); + request.removeNote(ALREADY_FILTERED_NOTE); + final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); + Thread.currentThread().setContextClassLoader(applicationClassLoader); + manager.store(request.getSession(false)); + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } } + } else { + getNext().invoke(request, response); } } diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/UpdateValve.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/UpdateValve.java index 0ac98e73f..4aef9ed77 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/UpdateValve.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/UpdateValve.java @@ -31,6 +31,7 @@ import org.apache.catalina.valves.ValveBase; */ public class UpdateValve extends ValveBase { + private static final String ALREADY_FILTERED_NOTE = UpdateValve.class.getName() + ".ALREADY_FILTERED_NOTE"; private final RedissonSessionManager manager; public UpdateValve(RedissonSessionManager manager) { @@ -40,17 +41,24 @@ public class UpdateValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { - try { - getNext().invoke(request, response); - } finally { - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + //check if we already filtered/processed this request + if (request.getNote(ALREADY_FILTERED_NOTE) == null) { + request.setNote(ALREADY_FILTERED_NOTE, Boolean.TRUE); try { - ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); - Thread.currentThread().setContextClassLoader(applicationClassLoader); - manager.store(request.getSession(false)); + getNext().invoke(request, response); } finally { - Thread.currentThread().setContextClassLoader(classLoader); + request.removeNote(ALREADY_FILTERED_NOTE); + final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); + Thread.currentThread().setContextClassLoader(applicationClassLoader); + manager.store(request.getSession(false)); + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } } + } else { + getNext().invoke(request, response); } } diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/UpdateValve.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/UpdateValve.java index 0ac98e73f..4aef9ed77 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/UpdateValve.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/UpdateValve.java @@ -31,6 +31,7 @@ import org.apache.catalina.valves.ValveBase; */ public class UpdateValve extends ValveBase { + private static final String ALREADY_FILTERED_NOTE = UpdateValve.class.getName() + ".ALREADY_FILTERED_NOTE"; private final RedissonSessionManager manager; public UpdateValve(RedissonSessionManager manager) { @@ -40,17 +41,24 @@ public class UpdateValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { - try { - getNext().invoke(request, response); - } finally { - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + //check if we already filtered/processed this request + if (request.getNote(ALREADY_FILTERED_NOTE) == null) { + request.setNote(ALREADY_FILTERED_NOTE, Boolean.TRUE); try { - ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); - Thread.currentThread().setContextClassLoader(applicationClassLoader); - manager.store(request.getSession(false)); + getNext().invoke(request, response); } finally { - Thread.currentThread().setContextClassLoader(classLoader); + request.removeNote(ALREADY_FILTERED_NOTE); + final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); + Thread.currentThread().setContextClassLoader(applicationClassLoader); + manager.store(request.getSession(false)); + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } } + } else { + getNext().invoke(request, response); } } diff --git a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/UpdateValve.java b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/UpdateValve.java index 0ac98e73f..4aef9ed77 100644 --- a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/UpdateValve.java +++ b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/UpdateValve.java @@ -31,6 +31,7 @@ import org.apache.catalina.valves.ValveBase; */ public class UpdateValve extends ValveBase { + private static final String ALREADY_FILTERED_NOTE = UpdateValve.class.getName() + ".ALREADY_FILTERED_NOTE"; private final RedissonSessionManager manager; public UpdateValve(RedissonSessionManager manager) { @@ -40,17 +41,24 @@ public class UpdateValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { - try { - getNext().invoke(request, response); - } finally { - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + //check if we already filtered/processed this request + if (request.getNote(ALREADY_FILTERED_NOTE) == null) { + request.setNote(ALREADY_FILTERED_NOTE, Boolean.TRUE); try { - ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); - Thread.currentThread().setContextClassLoader(applicationClassLoader); - manager.store(request.getSession(false)); + getNext().invoke(request, response); } finally { - Thread.currentThread().setContextClassLoader(classLoader); + request.removeNote(ALREADY_FILTERED_NOTE); + final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + ClassLoader applicationClassLoader = request.getContext().getLoader().getClassLoader(); + Thread.currentThread().setContextClassLoader(applicationClassLoader); + manager.store(request.getSession(false)); + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } } + } else { + getNext().invoke(request, response); } }