18

Spring Boot ActuatorTrace在捕获输入/输出 HTTP 参数、标头、用户等方面做得很好。我想扩展它以捕获 HTTP 响应的主体,这样我就可以全面了解即将发生的事情进出 web 层。看着TraceProperties,似乎没有一种方法可以配置响应正文捕获。是否有一种“安全”的方式来捕获响应主体,而不会弄乱它发回的任何字符流?

4

3 回答 3

8

最近,我写了一篇关于自定义 Spring Boot Actuatortrace端点的博客文章,在使用 Actuator 时,我有点惊讶,response body它不是要跟踪的受支持属性之一。

我想我可能需要这个功能,并想出了一个快速的解决方案,这要归功于 Logback 的TeeFilter.

为了复制响应的输出流,我没有过多检查就复制并使用了 TeeHttpServletResponseTeeServletOutputStream 。

然后,就像我在博客文章中解释的那样,扩展WebRequestTraceFilter如下:

@Component
public class RequestTraceFilter extends WebRequestTraceFilter {

    RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
        super(repository, properties);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response);

        filterChain.doFilter(request, teeResponse);

        teeResponse.finish();

        request.setAttribute("responseBody", teeResponse.getOutputBuffer());

        super.doFilterInternal(request, teeResponse, filterChain);
    }

    @Override
    protected Map<String, Object> getTrace(HttpServletRequest request) {
        Map<String, Object> trace = super.getTrace(request);

        byte[] outputBuffer = (byte[]) request.getAttribute("responseBody");

        if (outputBuffer != null) {
            trace.put("responseBody", new String(outputBuffer));
        }

        return trace;
    }
}

现在,您可以responseBody在 JSONtrace端点服务中看到。

于 2017-09-02T00:18:42.250 回答
0

httptrace使用 webflux 响应式堆栈,可以使用 spring-cloud-gateway 捕获 http 请求和响应体,并通过定义自定义 HttpTraceWebFilter将它们注入到执行器中。

在https://gist.github.com/gberche-orange/06c26477a313df9d19d20a4e115f079f查看完整的相关代码

这需要相当多的重复,希望springboot团队能帮助减少这种重复,请参阅相关的https://github.com/spring-projects/spring-boot/issues/23907

于 2020-10-26T13:39:57.097 回答
0

来自 Spring 维护者之一:

跟踪请求和响应正文从未得到开箱即用的支持。放弃了对跟踪参数的支持,因为当请求是 POST 表单数据时,它需要读取整个请求正文。

https://github.com/spring-projects/spring-boot/issues/12953

于 2020-10-08T04:32:46.797 回答