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

时间:2009-12-02 23:59:39

标签: java http request

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

提前致谢。

3 个答案:

答案 0 :(得分:5)

没有。

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

您的替代方案是:

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

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

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

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

  5. 数据包嗅探。

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

    随访:

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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

这种方法有什么问题?