【问题标题】:Jersey 1.8 (Custom) Logging filterJersey 1.8(自定义)日志过滤器
【发布时间】:2016-09-24 11:30:35
【问题描述】:

web.xml 有

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
  <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
  <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>

这不会打印传入的请求实体。它只打印标题和其他内容。请求实体打印为空字符串

然后我从 LoggingFilter 中获取了一个参考代码,看看它为什么不起作用

    final StringBuilder b = new StringBuilder();
    printRequestLine(b, request);
    printRequestHeaders(b, request.getRequestHeaders());


    ByteArrayOutputStream out = new ByteArrayOutputStream();
    InputStream in = request.getEntityInputStream();
    try {
        if(in.available() > 0) {
            ReaderWriter.writeTo(in, out);

            byte[] requestEntity = out.toByteArray();
            printEntity(b, requestEntity);

            request.setEntityInputStream(new ByteArrayInputStream(requestEntity));
        }
        return request;
    } catch (IOException ex) {
        throw new ContainerException(ex);
    } finally {
        logger.info(b.toString());
    }

InputStream 持有的对象

org.apache.catalina.connector.CoyoteInputStream

如果我删除条件 if(in.available() > 0),则此代码有效并打印请求

in.available() 总是返回 0,因为输入流正在保存传入的请求

如果我删除该条件,代码可能会失败的情况是什么? 它没有给我 available() 价值的原因是什么?

【问题讨论】:

标签: java spring jakarta-ee logging jersey


【解决方案1】:

默认情况下,日志过滤器不打印实体。有一个构造函数可以启用它。

https://jersey.java.net/apidocs/2.11/jersey/org/glassfish/jersey/filter/LoggingFilter.html#LoggingFilter(java.util.logging.Logger,布尔值)

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 2017-12-28
    • 1970-01-01
    • 2020-01-19
    • 2016-07-10
    • 1970-01-01
    • 2021-05-28
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多