[英]Log request body for jersey client 1.18.1
我在Jersey客户端1.18.1上使用JEE6(在服务器上,不能更改它),并且我想将所有HTTP get / post请求/响应记录到DB(以String格式)中,并使用ClientFilter进行拦截。
为了响应,我可以使用IOUtils复制resp.getEntityInputStream()
,然后转换回字符串。
但是对于请求,没有“ getEntityInputStream
”,并且要满足不同类型的需要很多工作-字符串,表单,jaxb等
所以我的问题是,在Jersery Client中是否有更简单的方法来处理此问题? 如果没有,是否还有其他框架/工具可以帮助您?
您想在它仍然是字符串的情况下预先拦截它。 但是,您只能获得一次,因此需要保留它以提供给需要它的任何其他对象。
以下是取自现有代码库的主体预取过滤器的主要部分。 请注意,如果您要登录到数据库,则可能希望将其与请求流分离开,也许是通过将主体发布到消息总线上并由一个单独的进程执行日志记录来避免每个请求都必须等待一个请求。数据库写。
public class BodyPrefetchFilter implements Filter
{
private static final Logger LOGGER = LoggerFactory.getLogger(BodyPrefetchFilter.class);
@Override
public void init(final FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(final ServletRequest servletRequest,
final ServletResponse servletResponse,
final FilterChain chain) throws IOException, ServletException
{
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;
BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpServletRequest);
chain.doFilter(bufferedRequest, httpServletResponse);
}
private static final class BufferedRequestWrapper extends HttpServletRequestWrapper
{
private byte[] body = null;
public BufferedRequestWrapper(HttpServletRequest req) throws IOException
{
super(req);
// Store the body
final InputStream is = req.getInputStream();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buf)) > 0)
{
baos.write(buf, 0, bytesRead);
}
this.body = baos.toByteArray();
if (this.body.length > 0)
{
LOGGER.debug("Body of request is \"{}\"", new String(this.body, "UTF-8"));
}
}
@Override
public ServletInputStream getInputStream()
{
ByteArrayInputStream bais = new ByteArrayInputStream(this.body);
return new BufferedServletInputStream(bais);
}
}
private static final class BufferedServletInputStream extends ServletInputStream
{
private final ByteArrayInputStream inputStream;
public BufferedServletInputStream(final ByteArrayInputStream inputStream)
{
this.inputStream = inputStream;
}
@Override
public int available()
{
return this.inputStream.available();
}
@Override
public int read()
{
return this.inputStream.read();
}
@Override
public int read(final byte[] buf, final int off, final int len)
{
return this.inputStream.read(buf, off, len);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.