【问题标题】:Logging request with JAX-RS resteasy and ContainerRequestFilter/ContainerResponseFilter使用 JAX-RS resteasy 和 ContainerRequestFilter/ContainerResponseFilter 记录请求
【发布时间】:2017-09-07 05:10:05
【问题描述】:

我想记录整个请求和响应正文。出于记录目的,jax-rs 有过滤器。

public class ResponseLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // It's always empty string
        System.out.println(responseContext.getEntity().toString());  // Here is actual response. It's OK
    }
    public void filter(ContainerRequestContext requestContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // Here is actual response. But this request is empty in main code. 
    }
}

在响应过滤器中,我无法获取请求正文。 在请求过滤器中我得到它但是:

  • 我无法获得请求正文和响应正文之间的链接。
  • 一旦从流中写入请求正文,将此流设置为空,我无法在我的主代码中获取它。

我正在使用 Resteasy 3.0.6。

【问题讨论】:

    标签: java logging jax-rs resteasy


    【解决方案1】:

    1.在请求和响应之间建立联系使用:

    @Override
        public void filter(ContainerRequestContext paramContainerRequestContext, ContainerResponseContext paramContainerResponseContext) throws IOException {
            ...     
        }
    
    1. 要将流返回到主代码,请使用setEntityStream 将其写回:

      ByteArrayOutputStream out = new ByteArrayOutputStream();
      InputStream in = requestContext.getEntityStream();
      
      final StringBuilder b = new StringBuilder();
      try {
          ReaderWriter.writeTo(in, out);
      
          byte[] requestEntity = out.toByteArray();
          ...
          requestContext.setEntityStream(new ByteArrayInputStream(requestEntity));
      

    编辑

    ClientLoggingFilter的请求正文和响应正文之间添加使用@Moritz Becker 注释示例链接:

    @Override
        public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext)
                throws IOException {
            ...
            final Object requestId = requestContext.getProperty(LOGGING_ID_PROPERTY);
            final long id = requestId != null ? (Long) requestId : _id.incrementAndGet();
    
            final StringBuilder b = new StringBuilder();
    
            printResponseLine(b, "Client response received", id, responseContext.getStatus());
            printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getHeaders());
    

    【讨论】:

    • 1.在 ContainerResponseFilter requestContext.getEntityStream() 中,它始终为空。 2. 成功了,谢谢!
    • 1.您可以执行其他操作 requestContext.getHeaderString("Access-Control-Request-Headers") 或 requestContext.getProperty("random-token")
    • 没关系,但是响应正文是空的,我没有看到将请求正文从 ContainerRequestFilter 链接到 ContainerResponseFilter 中的响应正文的解决方案。
    • 另外,请参阅org.glassfish.jersey.logging.ClientLoggingFilter 了解如何记录请求/响应。
    猜你喜欢
    • 2018-11-24
    • 2017-09-14
    • 2013-01-13
    • 1970-01-01
    • 2016-02-13
    • 2014-02-28
    • 2014-05-18
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多