Skip to content

Commit e766684

Browse files
committed
feat: support TongWeb8
1 parent f2c4d16 commit e766684

File tree

9 files changed

+638
-24
lines changed

9 files changed

+638
-24
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/Server.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public enum Server {
101101
*/
102102
TongWeb6(new TongWeb6Shell()),
103103
TongWeb7(new TongWeb7Shell()),
104+
TongWeb8(new TongWeb8Shell()),
104105

105106
/**
106107
* 金蝶天燕中间件

generator/src/main/java/com/reajason/javaweb/memshell/generator/ValveGenerator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class ValveGenerator {
3131
public static final String BES_VALVE_PACKAGE = "com.bes.enterprise.webtier";
3232
public static final String TONGWEB6_VALVE_PACKAGE = "com.tongweb.web.thor";
3333
public static final String TONGWEB7_VALVE_PACKAGE = "com.tongweb.catalina";
34+
public static final String TONGWEB8_VALVE_PACKAGE = "com.tongweb.server";
3435

3536
public static class ValveRenameVisitorWrapper implements AsmVisitorWrapper {
3637
private final String newPackageName;

generator/src/main/java/com/reajason/javaweb/memshell/server/ServerToolRegistry.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping)
4141
shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB7_VALVE_PACKAGE, shellClass);
4242
}
4343

44+
if (isValve && shell instanceof TongWeb8Shell) {
45+
shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB8_VALVE_PACKAGE, shellClass);
46+
}
47+
4448
if (isValve && shell instanceof BesShell) {
4549
shellClass = ValveGenerator.generateValveClass(ValveGenerator.BES_VALVE_PACKAGE, shellClass);
4650
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.reajason.javaweb.memshell.server;
2+
3+
import com.reajason.javaweb.memshell.injector.tongweb.*;
4+
5+
import static com.reajason.javaweb.memshell.ShellType.*;
6+
7+
/**
8+
* @author ReaJason
9+
* @since 2024/12/27
10+
*/
11+
public class TongWeb8Shell extends AbstractShell {
12+
13+
@Override
14+
public Class<?> getListenerInterceptor() {
15+
return TomcatShell.ListenerInterceptor.class;
16+
}
17+
18+
@Override
19+
public InjectorMapping getShellInjectorMapping() {
20+
return InjectorMapping.builder()
21+
.addInjector(LISTENER, TongWebListenerInjector.class)
22+
.addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class)
23+
.addInjector(FILTER, TongWebFilterInjector.class)
24+
.addInjector(JAKARTA_FILTER, TongWebFilterInjector.class)
25+
.addInjector(VALVE, TongWebValveInjector.class)
26+
.addInjector(JAKARTA_VALVE, TongWebValveInjector.class)
27+
.addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class)
28+
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TongWebContextValveAgentInjector.class)
29+
.build();
30+
}
31+
}

memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentInjector.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
public class TongWebFilterChainAgentInjector implements ClassFileTransformer {
1717
private static final String TARGET_CLASS = "com/tongweb/web/thor/core/ApplicationFilterChain";
1818
private static final String TARGET_CLASS_1 = "com/tongweb/catalina/core/ApplicationFilterChain";
19+
private static final String[] TARGET_CLASSES = new String[]{
20+
"com/tongweb/web/thor/core/ApplicationFilterChain",
21+
"com/tongweb/catalina/core/ApplicationFilterChain",
22+
"com/tongweb/server/core/ApplicationFilterChain"
23+
};
1924
private static final String TARGET_METHOD_NAME = "doFilter";
2025

2126
public static String getClassName() {
@@ -39,10 +44,11 @@ private static void launch(Instrumentation inst) throws Exception {
3944
inst.addTransformer(new TongWebFilterChainAgentInjector(), true);
4045
for (Class<?> allLoadedClass : inst.getAllLoadedClasses()) {
4146
String name = allLoadedClass.getName();
42-
if (TARGET_CLASS.replace("/", ".").equals(name)
43-
|| TARGET_CLASS_1.replace("/", ".").equals(name)) {
44-
inst.retransformClasses(allLoadedClass);
45-
System.out.println("MemShell Agent is working at " + name + ".doFilter");
47+
for (String targetClass : TARGET_CLASSES) {
48+
if (targetClass.replace("/", ".").equals(name)) {
49+
inst.retransformClasses(allLoadedClass);
50+
System.out.println("MemShell Agent is working at " + name + ".doFilter");
51+
}
4652
}
4753
}
4854
}
@@ -51,21 +57,23 @@ private static void launch(Instrumentation inst) throws Exception {
5157
@SuppressWarnings("all")
5258
public byte[] transform(final ClassLoader loader, String className, Class<?> classBeingRedefined,
5359
ProtectionDomain protectionDomain, byte[] bytes) {
54-
if (TARGET_CLASS.equals(className) || TARGET_CLASS_1.equals(className)) {
55-
defineTargetClass(loader);
56-
try {
57-
ClassReader cr = new ClassReader(bytes);
58-
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) {
59-
@Override
60-
protected ClassLoader getClassLoader() {
61-
return loader;
62-
}
63-
};
64-
ClassVisitor cv = getClassVisitor(cw);
65-
cr.accept(cv, ClassReader.EXPAND_FRAMES);
66-
return cw.toByteArray();
67-
} catch (Exception e) {
68-
e.printStackTrace();
60+
for (String targetClass : TARGET_CLASSES) {
61+
if (className.equals(targetClass)) {
62+
defineTargetClass(loader);
63+
try {
64+
ClassReader cr = new ClassReader(bytes);
65+
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) {
66+
@Override
67+
protected ClassLoader getClassLoader() {
68+
return loader;
69+
}
70+
};
71+
ClassVisitor cv = getClassVisitor(cw);
72+
cr.accept(cv, ClassReader.EXPAND_FRAMES);
73+
return cw.toByteArray();
74+
} catch (Exception e) {
75+
e.printStackTrace();
76+
}
6977
}
7078
}
7179
return bytes;

memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public TongWebFilterInjector() {
4949
* /opt/tweb6/lib/twnt.jar
5050
* com.tongweb.catalina.core.ApplicationContext
5151
* /opt/tweb7/lib/tongweb.jar
52+
* com.tongweb.server.core.ApplicationContext
53+
* /opt/tweb8/lib/tongweb-web.jar
5254
*/
5355
public List<Object> getContext() throws Exception {
5456
List<Object> contexts = new ArrayList<Object>();
@@ -102,14 +104,21 @@ public void inject(Object context, Object filter) throws Exception {
102104
ClassLoader contextClassLoader = context.getClass().getClassLoader();
103105
try {
104106
// tongweb 7
107+
constructor = contextClassLoader.loadClass("com.tongweb.catalina.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
105108
filterDef = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterDef").newInstance();
106109
filterMap = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterMap").newInstance();
107-
constructor = contextClassLoader.loadClass("com.tongweb.catalina.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
108110
} catch (Exception e2) {
109-
// tongweb 6
110-
filterDef = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterDef").newInstance();
111-
filterMap = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterMap").newInstance();
112-
constructor = contextClassLoader.loadClass("com.tongweb.web.thor.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
111+
try {
112+
// tongweb 6
113+
constructor = contextClassLoader.loadClass("com.tongweb.web.thor.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
114+
filterDef = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterDef").newInstance();
115+
filterMap = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterMap").newInstance();
116+
} catch (Exception e) {
117+
// tongweb 8
118+
constructor = contextClassLoader.loadClass("com.tongweb.server.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
119+
filterDef = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterDef").newInstance();
120+
filterMap = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterMap").newInstance();
121+
}
113122
}
114123
invokeMethod(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{filterClassName});
115124
invokeMethod(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filterClassName});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.tongweb.server;
2+
3+
import com.tongweb.server.connector.Request;
4+
import com.tongweb.server.connector.Response;
5+
6+
import javax.servlet.ServletException;
7+
import java.io.IOException;
8+
9+
public interface Valve {
10+
Valve getNext();
11+
12+
void setNext(Valve var1);
13+
14+
void backgroundProcess();
15+
16+
void invoke(Request var1, Response var2) throws IOException, ServletException;
17+
18+
boolean isAsyncSupported();
19+
}

0 commit comments

Comments
 (0)