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

sav*_*nna 3 java http request

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

提前致谢.

nos*_*nos 5

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

不过,您可以获取解析后的请求标头和 uri:

ETC。


Ste*_*n C 5

没有.

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

您的替代方案是:

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

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

  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生成太多输出,并转储所有请求而不仅仅是坏请求.