如何在IBM iSeries系统的Apache抓包或Tomcat捕获SOAP信封?排查504超时
捕获SOAP请求信封的方法(Apache + Tomcat环境)
一、在Apache中捕获SOAP请求
方法1:使用mod_dumpio模块
该模块可直接输出完整的请求/响应内容到Apache日志:
- 确认启用mod_dumpio模块,在Apache主配置文件(如
httpd.conf)中添加或启用:
注:IBM i系统上的模块路径可能为LoadModule dumpio_module modules/mod_dumpio.so/QOpenSys/pkgs/lib/httpd/modules/mod_dumpio.so,请根据实际安装路径调整。 - 添加以下配置开启请求捕获:
DumpIOInput On DumpIOOutput On LogLevel dumpio:trace7 - 重启Apache服务,查看Apache错误日志(如
error_log)即可找到包含SOAP信封的完整请求内容。测试完成后务必关闭该配置,避免日志量过大。
方法2:自定义日志格式记录请求体
通过mod_log_config自定义日志格式,直接记录SOAP请求体:
在Apache配置中添加:
# 定义包含请求体的日志格式 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{Content-Length}i %{Content-Type}i %{REQUEST_BODY}s" soap_request_log # 指定日志文件路径 CustomLog logs/soap_requests.log soap_request_log
重启Apache后,soap_requests.log会记录POST类请求的内容(包括SOAP信封)。
二、在Tomcat中捕获SOAP请求
方法1:使用RequestDumperValve
Tomcat自带的Valve可输出请求的所有细节,包括SOAP请求体:
- 编辑Tomcat的
server.xml,在AJP连接器配置段添加请求日志参数:
或直接在<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" enableLookups="false" requestLogEnabled="true" requestLogValveClass="org.apache.catalina.valves.RequestDumperValve"/><Host>节点下添加该Valve:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RequestDumperValve"/> </Host> - 重启Tomcat,查看
localhost.log或对应主机日志即可获取SOAP信封内容。测试完成后删除该配置,避免日志过载。
方法2:自定义Servlet Filter捕获请求
通过Java Filter精准捕获特定路径的SOAP请求:
- 编写Filter类:
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.util.logging.Logger; public class SOAPRequestCaptureFilter implements Filter { private static final Logger logger = Logger.getLogger(SOAPRequestCaptureFilter.class.getName()); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpReq = (HttpServletRequest) request; // 仅捕获SOAP POST请求 if ("POST".equalsIgnoreCase(httpReq.getMethod()) && "text/xml".equals(httpReq.getContentType())) { BufferedReader reader = httpReq.getReader(); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } logger.info("Captured SOAP Request:\n" + sb.toString()); } chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} } - 在
web.xml中配置Filter,映射到你的SOAP服务路径:<filter> <filter-name>SOAPRequestCaptureFilter</filter-name> <filter-class>com.your.package.SOAPRequestCaptureFilter</filter-class> </filter> <filter-mapping> <filter-name>SOAPRequestCaptureFilter</filter-name> <url-pattern>/your-soap-service/*</url-pattern> </filter-mapping> - 重启Tomcat后,Filter会自动捕获指定路径下的SOAP请求并打印到Tomcat日志中。
注意事项
- 所有日志捕获配置在测试完成后务必关闭,避免占用过多磁盘空间
- 若请求包含敏感数据(如用户信息、认证凭证),捕获后需及时清理日志文件
- IBM i系统上的Apache和Tomcat配置文件路径可能与常规环境不同,需根据实际安装路径调整
内容的提问来源于stack exchange,提问作者Rahul Dhiman
相关产品推荐
相关产品推荐

