【发布时间】: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() 价值的原因是什么?
【问题讨论】:
-
Seems related to Tomcat。那里有一条评论建议使用 NIO 连接器。
标签: java spring jakarta-ee logging jersey