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

有没有办法从JavaServlet处理程序获取原始http请求流?,java,http,request,Java,Http,Request,我正在尝试进行一些日志记录,以捕获到达我的应用程序的原始http请求。我的Java代码在SpringMVC控制器中。我有权访问“HttpServletRequest”对象。但是我找不到一种方法来从中提取原始http请求流。有一个读者,但只阅读文章内容。我想要的是整个shebang、url、标题和正文。有没有一个简单的方法可以做到这一点 提前谢谢 不,servlet不提供api来获取原始请求——为此,您可能需要像wireshark这样的嗅探器 您可以通过以下方式获取已解析的请求头和uri:

我正在尝试进行一些日志记录,以捕获到达我的应用程序的原始http请求。我的Java代码在SpringMVC控制器中。我有权访问“HttpServletRequest”对象。但是我找不到一种方法来从中提取原始http请求流。有一个读者,但只阅读文章内容。我想要的是整个shebang、url、标题和正文。有没有一个简单的方法可以做到这一点


提前谢谢

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

您可以通过以下方式获取已解析的请求头和uri:

等等。

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

你的选择是:

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

  • 您可以通过过滤器获得所需的标题信息,尽管它们不显示原始请求

  • 一些servlet容器具有请求头日志记录;e、 使用Tomcat有一个名为RequestDumperValve的beast,您可以在“server.xml”文件中配置它

  • 实现一个位于客户机和“真正”服务器之间的代理服务器

  • 包嗅探

  • 哪一个最好取决于你真正想要达到的目标

    后续行动:

    如果“不好”在头中,那么RequestDumperValve方法可能是调试的最佳方法。转到“$CATALINA_HOME/conf/server.xml”文件,搜索“RequestDumperValve”并取消对元素的注释。然后重新启动Tomcat。您还可以在webapp的“context.xml”文件中执行相同的操作。默认情况下,转储的请求和响应以“logs/catalina.out”结尾。请注意,这将提供大量的输出,所以您不希望在生产中这样做。。。除非是万不得已

    如果不良内容存在于POST或PUT请求的内容中,则需要修改应用程序,以便在从输入流读取内容时保存内容副本。我不知道这有什么捷径


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

    我在部署在Tomcat 5.5上的Web应用程序中读取了原始请求

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


    这种方法有什么问题?

    谢谢您提供的信息。我想要实现的是,当出现错误/错误请求时,只需记录完整的请求。我将按照nos的建议执行。
    request.getInputStream()
    将只获取请求的正文,而不获取标题。OP想要“整个shebang、url、标题和正文”。事实上,我听说ASP有一个神奇的解决方案:Request.ServerVariables[“ALL_RAW”],但这不是一个Java Servlet。哦,好吧。