其他分享
首页 > 其他分享> > 如何在Spring Boot Actuator的Trace中包含JSON响应体?

如何在Spring Boot Actuator的Trace中包含JSON响应体?

作者:互联网

Spring Boot Actuator的Trace可以很好地捕获输入/输出HTTP参数,标题,用户等.我想扩展它以捕获HTTP响应的主体,这样我就可以全面了解什么是进出网页层.查看TraceProperties,看起来没有办法配置响应正文捕获.是否有一种“安全”的方式来捕获响应主体而不会弄乱它发回的任何字符流?

解决方法:

最近,我写了一篇关于定制Spring Boot Actuator的跟踪端点的blog post,在玩Actuator时,我有点惊讶的是,响应体不是被支持的跟踪属性之一.

我想我可能需要这个功能,并且由于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;
    }
}

现在,您可以在JSON跟踪端点服务中看到responseBody.

标签:spring-boot-actuator,spring,json,spring-boot,trace
来源: https://codeday.me/bug/20191006/1860742.html