json - 如何在 Spring Boot Actuator 的 Trace 中包含 JSON 响应正文?

标签 json spring spring-boot trace spring-boot-actuator

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

最佳答案

最近写了一篇blog post关于 Spring Boot Actuator 的 trace 端点的自定义,在使用 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;
    }
}

现在,您可以在 JSON trace 端点服务中看到 responseBody

关于json - 如何在 Spring Boot Actuator 的 Trace 中包含 JSON 响应正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848802/

相关文章:

java - Spring Boot 无法呈现(非常)简单的 index.jsp

spring - JPA Hibernate 无法将 java.lang.String 字段设置为 java.lang.String 异常

java - 如何解决java中的响应代码406错误?

c# - 在c#中反序列化protobuf

javascript - 从 json 响应对象中过滤数据

java - 添加 spring-data-jpa 模式引用后,Spring 配置 xml 无效

spring - 在抽象父类(super class)中注入(inject)spring依赖

java - hibernate 多对一外键未设置

json - Elasticsearch 嵌套过滤器

java - Spring Security 使用 jwt 获取所有用户登录