[英]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.