在 WildFly 8 中转储 HTTP 请求
Posted
技术标签:
【中文标题】在 WildFly 8 中转储 HTTP 请求【英文标题】:Dump HTTP requests in WildFly 8 【发布时间】:2014-12-30 04:28:43 【问题描述】:为了在开发过程中调试 HTTP 请求,我希望 WildFly 8 应用服务器将 HTTP 请求(包括请求方法和标头)转储到日志文件中。 server.log
就好了。
在WildFly的HTTP子系统的源码中,我找到了RequestDumpingHandler和对应的日志分类io.undertow.request.dump
但是,我不知道如何安装该标头,以便将其应用于我的应用程序提供的所有请求(带有一些静态资源和 JAX-RS 处理程序的 WAR)。
相应的文档页面 (Undertow web subsystem configuration) 并没有真正解释处理程序。配置部分有一个<handler>
元素
<?xml version="1.0" ?>
<server xmlns="urn:jboss:domain:2.1">
...
<profile>
...
<subsystem xmlns="urn:jboss:domain:undertow:1.1">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
</servlet-container>
<handlers>
<file name="welcome-content" path="$jboss.home.dir/welcome-content"/>
<!-- <dump-request /> ?? or something?-->
</handlers>
<filters>
<response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
</filters>
</subsystem>
...
</profile>
...
</server>
但据我所知,那里只有<file>
和代理(?)。
如何在 WildFly 中记录传入 HTTP 请求的完整详细信息? 我知道我可以在 JAX-RS 层安装一些日志记录机制,但我希望有一个转储机制来处理这两种情况REST API 调用和静态提供的资源。
【问题讨论】:
【参考方案1】:您需要将 RequestDumpingHandler 添加到您的处理程序链中。
作为 wildfly 8.1 的一部分,这还不能以友好的方式实现。
这在 8.2 和 9 中得到了改进,因此您可以通过添加以下内容来配置它:
<host name="default-host" >
.....
<filter-ref name="request-dumper"/>
</host>
....
<filters>
...
<filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core" />
</filters>
在 8.1 中,现在唯一的选择是添加 ServletExtension http://undertow.io/undertow-docs/undertow-docs-1.2.0/#servlet-extensions
这会将这个 RequestDumpingHandler 添加到外链。
FWIW 8.2 版本几乎准备就绪,因此您可以等待它或为 8.x 分支构建源代码。
要通过 CLI 添加上述配置,您可以使用:
/subsystem=undertow/configuration=filter/custom-filter=request-dumper:add(class-name="io.undertow.server.handlers.RequestDumpingHandler", module="io.undertow.core")
/subsystem=undertow/server=default-server/host=default-host/filter-ref=request-dumper:add
【讨论】:
请问有没有办法用这个处理程序转储请求/响应正文? @ctomc 有什么办法打印http请求和响应的内容? @tarilabs 你找到解决方案了吗? @Zeus 嗨,已经很久了,但是 IIRC 我还需要为请求/响应执行其他自定义操作,我最终编写了自己的自定义处理程序,而不是默认处理程序。跨度> 如何使用 jboss-cli 添加这个过滤器?【参考方案2】:在 Wildfly 9 和 10.1.0 上,只需添加
<subsystem xmlns="urn:jboss:domain:undertow:3.1">
<server name="default-server">
<host name="default-host" alias="localhost">
<access-log/>
</host>
</server>
</sub-system>
【讨论】:
请注意,access-log 只是将请求写入 access.log 文件。它不记录标题或正文。【参考方案3】:有很多人询问如何注销整个 HTTP 正文,而不仅仅是标头。
似乎存在答案:https://8bitplatoon.blogspot.com/2017/02/dumping-http-requests-and-responses-in.html
简而言之,如果该链接不存在,只需在standalone.xml 中添加一个简单的内容即可:
<system-properties>
<property name="com.sun.xml.ws.transport.http.HttpAdapter.dump" value="true"/>
</system-properties>
我在<extensions>...</extensions>
和<management>...</management>
之前添加了这个,重新启动了wildfly,并且能够在我的服务器日志中获得完整的HTTP 正文(在我的例子中是server.log)。
据我所知,这根本不与 Undertow “请求转储器”交互或依赖,您可以做一个,另一个,或两者兼而有之。
【讨论】:
在wildfly 10上没有和我一起工作,我也重新启动了wildfly 您是否按照我评论中的(仍然有效的)链接将它放在正确的位置? (选项 2) 此处不适用于 JBoss 7.3。我正在使用 cli 设置属性并重新加载。以上是关于在 WildFly 8 中转储 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章
在 wildfly 中配置 http 到 https 重定向