【问题标题】:jetty server log request body码头服务器日志请求正文
【发布时间】:2016-08-19 00:01:16
【问题描述】:
RequestLogHandler requestLogHandler = new RequestLogHandler();
Slf4jRequestLog requestLog = new CustomSlf4jRequestLog();
requestLogHandler.setRequestLog(requestLog);

Slf4jRequestLog 仅记录请求方法、url 和日期,以及写入的响应状态代码和字节。 我绝对想为我的 PUT/POST 请求记录正文。 我从 Slf4jRequestLog 派生了 CustomSlf4jRequestLog 并尝试了:

public void log(Request request, Response response) {
        StringBuilder sb = new StringBuilder("RequestBody: ");
        try {
            LOG.info("BODY SIZE: " + request.getContentLength());
            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            LOG.info(sb.toString());

很遗憾没有打印出正文,因为它已经被处理程序处理了?

是否可以在这里获取请求正文?

(我真的很关心正文,因为我有 JsonProvider 并且我想在 Json 无法解析数据时查看整个请求体)或者当我的应用程序失败时,我想看看是什么导致了这种情况,而无需为每个输入请求添加日志记录。

【问题讨论】:

    标签: servlets jackson jetty


    【解决方案1】:

    Servlet 规范阻碍了你。

    正在处理请求的实际 servlet 已经读取了请求正文,导致从 request.getInputStream() 的进一步读取无效(您在 EOF)

    如果要捕获请求正文,则需要创建自定义 Servlet Filter,然后包装 HttpServletRequest,覆盖 getInputStream() AND getReader() 方法使用您自己的实现来复制已读取的数据。

    然后由您决定要对该请求正文内容的副本执行什么操作。

    或

    您可以使用像 Wireshark 这样的网络捕获实用程序来查看请求正文是什么。即使您使用 HTTPS,您也可以使用您的服务器证书配置 Wireshark 以检查加密对话。

    【讨论】:

      【解决方案2】:

      记录器再次对同一请求调用 getInputStream()。您不能两次读取相同的数据。你应该创建一个 ServletRequestWrapper 来制作请求正文的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多