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

标签 java http request

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

提前致谢。

最佳答案

没有。

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

您的备选方案是:

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

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

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

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

  5. 数据包嗅探。

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

跟进:

如果标题中存在“错误”,那么 RequestDumperValve 方法可能是调试的最佳方法。转到“$CATALINA_HOME/conf/server.xml”文件,搜索“RequestDumperValve”并取消注释该元素。然后重新启动Tomcat。您也可以在 webapp 的“context.xml”文件中执行相同的操作。默认情况下,转储的请求和响应最终位于“logs/catalina.out”中。请注意,这会产生大量输出,因此您不想在生产中这样做……除非万不得已。

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

此外,如果您想长时间保持登录状态,您可能需要通过调用 HttpServletRequest API 和记录 header 等自行解决问题。RequestDumperValve 生成​​过多的输出,不仅会转储所有请求坏的。

关于java - 有没有办法从 Java servlet 处理程序获取原始 http 请求流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1836760/

相关文章:

java - Java中的链表FIFO队列集合

java - 在我的自定义 ListView 项上,为什么 (string.length() <= 0) 始终为真,而 (string == "") 始终为假?

java - 资源泄漏 : 'in' is never closed

java - FutureTask 和 HttpSession 同步

python - 以类似文件的方式读取 HTTP 响应的库?

Grails - 检测请求是通过 HTTP 还是 HTTPS

sql - 当每行包含下一行的 id 时,对 SQL 请求进行排序

java - 在java中改变一个字节内的一位

javascript - http.get() 方法和 var request = require ('request' 之间有什么区别)

node.js - 在 POST 请求中转发上传的文件 - Express