From 9360408f6d7e17c311b2ca96b30221cbc4d0cfc2 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Tue, 10 Dec 2024 21:05:52 +0800 Subject: [PATCH] fix: jetty 10 and 11 filter add first failed --- .../jetty/injector/JettyFilterInjector.java | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/jetty/injector/JettyFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/jetty/injector/JettyFilterInjector.java index 686b3161..4e0bf46b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/jetty/injector/JettyFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/jetty/injector/JettyFilterInjector.java @@ -40,15 +40,14 @@ public class JettyFilterInjector { Object filter = getFilter(context); addFilter(context, filter); } - } catch (Exception ignored) { - + } catch (Exception e) { + e.printStackTrace(); } } - public void addFilter(Object context, Object magicFilter) { + public void addFilter(Object context, Object magicFilter) throws Exception { Class filterClass = magicFilter.getClass(); - try { Object servletHandler = getFV(context, "_servletHandler"); // 1. 判断是否已经注入 @@ -71,9 +70,24 @@ public class JettyFilterInjector { invokeMethod(servletHandler, "addFilterWithMapping", new Class[]{filterHolderClass, String.class, int.class}, new Object[]{filterHolder, getUrlPattern(), 1}); // 3. 修改Filter的优先级为第一位 - Object filterMaps = getFV(servletHandler, "_filterMappings"); - int filterLength = Array.getLength(filterMaps); - ArrayList reorderedFilters = new ArrayList(); + moveFilterToFirst(servletHandler); + + try { + // 4. 解决 jetty filterChainsCache 导致 filter 内存马连接失败的问题 + invokeMethod(servletHandler, "invalidateChainsCache"); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("filter added successfully"); + } + + void moveFilterToFirst(Object servletHandler) throws Exception { + Object filterMaps = getFV(servletHandler, "_filterMappings"); + ArrayList reorderedFilters = new ArrayList<>(); + int filterLength; + + if (filterMaps.getClass().isArray()) { + filterLength = Array.getLength(filterMaps); for (int i = 0; i < filterLength; i++) { Object filter = Array.get(filterMaps, i); String filterName = (String) getFV(filter, "_filterName"); @@ -86,16 +100,21 @@ public class JettyFilterInjector { for (int i = 0; i < filterLength; i++) { Array.set(filterMaps, i, reorderedFilters.get(i)); } - - try { - // 4. 解决 jetty filterChainsCache 导致 filter 内存马连接失败的问题 - invokeMethod(servletHandler, "invalidateChainsCache"); - } catch (Exception e) { - System.out.println("invalidateChainsCache error"); - e.printStackTrace(); + } else if (filterMaps instanceof ArrayList) { + ArrayList filterList = (ArrayList) filterMaps; + filterLength = filterList.size(); + for (Object filter : filterList) { + String filterName = (String) getFV(filter, "_filterName"); + if (filterName.equals(getClassName())) { + reorderedFilters.add(0, filter); + } else { + reorderedFilters.add(filter); + } } - } catch (Exception e) { - e.printStackTrace(); + filterList.clear(); + filterList.addAll(reorderedFilters); + } else { + throw new IllegalArgumentException("filterMaps must be either an array or an ArrayList"); } }