有没有办法从Java servlet处理程序获取原始http请求流?

我试图将一些日志记录捕获到我的应用程序的原始http请求。 我的Java代码在SpringMVC控制器中。 我可以访问“HttpServletRequest”对象。 但我找不到一种方法来获取原始的http请求流。 有一个读者,但只阅读post内容。 我想要的是整个shebang,url,标题,身体。 是否有捷径可寻?

提前致谢。

不,servlet没有提供api来获取原始请求 – 你可能需要像wireshark那样的嗅探器。

您可以获取已解析的请求标头和uri:

  • getHeaderNames()
  • getRequestURI()

等等

没有。

servlet没有提供这样的API,并且很难实现,因为(基本上)你不能从Socket中读取相同的数据两次。 获取头信息并不困难,但是在servlet容器中无法捕获原始头。 当您的应用程序读取/写入相关流时,您需要自己捕获它们。

您的替代方案是:

  1. 编写自己的HTTP协议的服务器端实现。 (可能不适合您的申请。)

  2. 您可以使用filter获取所需的标题信息,但它们不会显示原始请求。

  3. 一些servlet容器有请求头记录; 例如,对于Tomcat,有一个名为RequestDumperValve的野兽可以在“server.xml”文件中配置。

  4. 实现位于客户端和“真实”服务器之间的代理服务器。

  5. 数据包嗅探。

哪个最好取决于你真正想要实现的目标。

跟进:

如果标题中存在“badness”,则RequestDumperValve方法可能是调试的最佳方法。 转到“$ CATALINA_HOME / conf / server.xml”文件,搜索“RequestDumperValve”并取消注释该元素。 然后重启Tomcat。 您也可以在webapp的“context.xml”文件中执行等效操作。 转储的请求和响应默认以“logs / catalina.out”结尾。 请注意,这将提供大量输出,因此您不希望在生产中执行此操作…除非作为最后的手段。

如果错误在POST或PUT请求的内容中,则您需要修改应用程序以在从输入流中读取内容时保存内容的副本。 我不知道有任何捷径。

此外,如果您想长时间保持登录,您可能需要通过调用HttpServletRequest API和日志标头等来自己解决问题.RequestDumperValve生成太多输出,并转储所有请求而不仅仅是坏请求。

我设法在我在Tomcat 5.5上部署的webapplication中读取我的原始请求

我所要做的就是只使用request.getInputStream()通过我的servlet / Spring控制器读取HttpServletRequest。
它必须是请求的第一个API方法。 在任何filter或其他命令开始大量使用导致其完全由Web服务器读取的请求之前。

这种方法有什么问题?