diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ApusicWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ApusicWriter.java index f4c5e418..0b172bbb 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ApusicWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ApusicWriter.java @@ -10,7 +10,13 @@ import java.lang.reflect.Method; * @since 2025/8/10 */ public class ApusicWriter { + + private static boolean ok = false; + public ApusicWriter() { + if (ok) { + return; + } try { Object table = getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table"); for (int i = 0; i < Array.getLength(table); i++) { @@ -41,6 +47,8 @@ public class ApusicWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/GlassFishWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/GlassFishWriter.java index 8b7f3ce1..fdefa862 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/GlassFishWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/GlassFishWriter.java @@ -11,7 +11,12 @@ import java.util.Set; */ public class GlassFishWriter { + private static boolean ok = false; + public GlassFishWriter() { + if (ok) { + return; + } try { try { // GlassFish3 @@ -54,6 +59,8 @@ public class GlassFishWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java index 305a387d..ac4b480d 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java @@ -1,19 +1,30 @@ package com.reajason.javaweb.probe.payload.response; +import org.eclipse.jetty.util.Callback; + import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.nio.ByteBuffer; + +import static java.nio.charset.StandardCharsets.UTF_8; /** * @author ReaJason * @since 2025/8/5 */ public class JettyWriter { + + private static boolean ok = false; + public JettyWriter() { + if (ok) { + return; + } try { Thread thread = Thread.currentThread(); - System.out.println(thread); Object threadLocals = getFieldValue(thread, "threadLocals"); Object table = getFieldValue(threadLocals, "table"); for (int i = 0; i < Array.getLength(table); i++) { @@ -36,26 +47,34 @@ public class JettyWriter { if (request == null) { continue; } - // 在 Jetty12 ee8 ~ ee10 环境下 - // request 对象为 org.eclipse.jetty.server.internal.HttpChannelState$ChannelRequest - // 非 ServletRequest 实现,考虑到场景可能比较少,适配代码较多,因此下面暂未适配 String data = getDataFromReq(request); if (data != null && !data.isEmpty()) { - PrintWriter writer = (PrintWriter) invokeMethod(response, "getWriter", null, null); + StringWriter sw = new StringWriter(); + PrintWriter writer = new PrintWriter(sw); try { writer.write(run(data)); } catch (Throwable e) { e.printStackTrace(); e.printStackTrace(writer); } - writer.flush(); - writer.close(); + String result = sw.toString(); + System.out.println("result: " + result); + try { + PrintWriter resWriter = (PrintWriter) invokeMethod(response, "getWriter", null, null); + resWriter.write(result); + } catch (Exception e) { + invokeMethod(response, "setStatus", new Class[]{int.class}, new Object[]{200}); + ByteBuffer content = UTF_8.encode(result); + invokeMethod(response, "write", new Class[]{boolean.class, ByteBuffer.class, Callback.class}, new Object[]{true, content, null}); + } return; } } } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ResinWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ResinWriter.java index 40b84b20..6e74836a 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ResinWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/ResinWriter.java @@ -9,7 +9,13 @@ import java.lang.reflect.Method; * @since 2025/8/8 */ public class ResinWriter { + + private static boolean ok = false; + public ResinWriter() { + if (ok) { + return; + } try { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class invocationClazz = loader.loadClass("com.caucho.server.dispatch.ServletInvocation"); @@ -29,6 +35,8 @@ public class ResinWriter { invokeMethod(response, "close", null, null); } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java index d3a593fa..3af3297f 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java @@ -10,7 +10,12 @@ import java.lang.reflect.Method; */ public class SpringWebMvcWriter { + private static boolean ok = false; + public SpringWebMvcWriter() { + if (ok) { + return; + } try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Object requestAttributes = invokeMethod(classLoader.loadClass("org.springframework.web.context.request.RequestContextHolder"), "getRequestAttributes", null, null); @@ -31,6 +36,8 @@ public class SpringWebMvcWriter { } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TomcatWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TomcatWriter.java index aa3980c8..aa430359 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TomcatWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TomcatWriter.java @@ -7,7 +7,13 @@ import java.util.List; import java.util.Set; public class TomcatWriter { + + private static boolean ok = false; + public TomcatWriter() { + if (ok) { + return; + } try { Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { @@ -53,6 +59,10 @@ public class TomcatWriter { } List processors = (List) getFieldValue(requestGroupInfo, "processors"); for (Object processor : processors) { + String workerThreadName = (String) getFieldValue(processor, "workerThreadName"); + if (!Thread.currentThread().getName().equals(workerThreadName)) { + continue; + } // org.apache.coyote.Request Object coyoteRequest = getFieldValue(processor, "req"); // org.apache.catalina.connector.Request @@ -75,6 +85,8 @@ public class TomcatWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TongWebWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TongWebWriter.java index 610f41ec..8323910d 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TongWebWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/TongWebWriter.java @@ -7,7 +7,13 @@ import java.util.List; import java.util.Set; public class TongWebWriter { + + private static boolean ok = false; + public TongWebWriter() { + if (ok) { + return; + } try { Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { @@ -23,6 +29,10 @@ public class TongWebWriter { Object requestGroupInfo = getFieldValue(getFieldValue(getFieldValue(poller, "this$0"), "handler"), "global"); List processors = (List) getFieldValue(requestGroupInfo, "processors"); for (Object processor : processors) { + String workerThreadName = (String) getFieldValue(processor, "workerThreadName"); + if (!Thread.currentThread().getName().equals(workerThreadName)) { + continue; + } Object coyoteRequest = getFieldValue(processor, "req"); if (tryWriteRes(coyoteRequest)) { return; @@ -50,6 +60,8 @@ public class TongWebWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/UndertowWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/UndertowWriter.java index 63ca8f68..0a5b12ac 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/UndertowWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/UndertowWriter.java @@ -10,7 +10,13 @@ import java.lang.reflect.Method; * @since 2025/8/8 */ public class UndertowWriter { + + private static boolean ok = false; + public UndertowWriter() { + if (ok) { + return; + } try { Thread thread = Thread.currentThread(); Object threadLocals = getFieldValue(thread, "threadLocals"); @@ -38,6 +44,8 @@ public class UndertowWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebLogicWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebLogicWriter.java index 71a3c3ba..7139202b 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebLogicWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebLogicWriter.java @@ -9,7 +9,13 @@ import java.lang.reflect.Method; * @since 2025/8/10 */ public class WebLogicWriter { + + private static boolean ok = false; + public WebLogicWriter() { + if (ok) { + return; + } try { Object workEntry = getFieldValue(Thread.currentThread(), "workEntry"); Object request = null; @@ -45,6 +51,8 @@ public class WebLogicWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java index fb733df2..796284e3 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java @@ -12,7 +12,12 @@ import java.lang.reflect.Method; */ public class WebSphereWriter { + private static boolean ok = false; + public WebSphereWriter() { + if (ok) { + return; + } try { Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals"); for (Object wsThreadLocal : wsThreadLocals) { @@ -42,6 +47,8 @@ public class WebSphereWriter { } } catch (Throwable e) { e.printStackTrace(); + } finally { + ok = true; } }