Bal*_*usC 29
如果我理解正确,您想要记录响应正文吗?这是一项相当昂贵的任务,但如果这是业务需求......
正如@duffymo指出的那样,一个Filter
适合这个的地方.您可以通过将传入替换ServletResponse
为HttpServletResponseWrapper
实现来捕获响应主体,该实现替换了HttpServletResponse#getWriter()
将响应主体复制到某个缓冲区的自己的实现.使用替换的响应继续过滤器链后,只需记录副本.
这是一个启动示例,该doFilter()
方法如何:
public void doFilter(ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException {
final CopyPrintWriter writer = new CopyPrintWriter(response.getWriter());
chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
@Override public PrintWriter getWriter() {
return writer;
}
});
logger.log(writer.getCopy());
}
Run Code Online (Sandbox Code Playgroud)
这是如何CopyPrintWriter
看起来像:
public class CopyPrintWriter extends PrintWriter {
private StringBuilder copy = new StringBuilder();
public CopyPrintWriter(Writer writer) {
super(writer);
}
@Override
public void write(int c) {
copy.append((char) c); // It is actually a char, not an int.
super.write(c);
}
@Override
public void write(char[] chars, int offset, int length) {
copy.append(chars, offset, length);
super.write(chars, offset, length);
}
@Override
public void write(String string, int offset, int length) {
copy.append(string, offset, length);
super.write(string, offset, length);
}
public String getCopy() {
return copy.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
将此过滤器映射到url-pattern
您要为其记录响应的过滤器.请记住,二进制/静态内容(如图像,CSS,JS文件等)不会以这种方式记录.您希望通过使用足够具体的内容来排除它们url-pattern
,例如,*.jsp
或仅仅使用相关servlet-name
的servlet.如果你想记录二进制/静态内容(我没有看到任何好处),那么你也需要以HttpServletResponse#getOutputStream()
同样的方式替换.
pdo*_*ide 13
BalusC的替代方案回答 使用TeeOutputStream在时间上写入两个输出流.
public void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream ps = new PrintStream(baos);
chain.doFilter(req,new HttpServletResponseWrapper(res) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new DelegatingServletOutputStream(new TeeOutputStream(super.getOutputStream(), ps)
);
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new DelegatingServletOutputStream (new TeeOutputStream(super.getOutputStream(), ps))
);
}
});
//Get Response body calling baos.toString();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53570 次 |
最近记录: |