我有一个由Java Spring开发的RESTful服务。我在一个过滤器中创建了一些用于身份验证的过滤器,获取了一些自定义标头等等。我需要记录传入的请求和传出的响应。现在我坚持记录响应。这是过滤器
sentinel config-command mymaster <renamed-command>
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException
是获取内容所需的对象。
我知道有一些重复的问题已经回答,但由于某些原因,这些问题对我来说都不起作用。
servletResponse
之后filter
我想要记录响应内容的doFilter
方法。
当我检查chain.doFilter
或JSON
中的response
时,我可以看到outputStream
对象。但我无法以编程方式获得它。
有人可以帮我解决这个问题吗?提前谢谢!
以下是我使用过的链接,但没有帮助:
How to read and copy the HTTP servlet response output stream content for logging
Capture and log the response body
Logging response body (HTML) from HttpServletResponse using Spring MVC HandlerInterceptorAdapter
答案 0 :(得分:1)
对于自定义解决方案,这是一个想法。
在过滤器中,您需要包装响应并拦截servlet的输出,以便您可以编写它。
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws ServletException, IOException {
// Wrap the response
MyResponseWrapper responseWrapper =
new MyResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseWrapper);
}
MyResponseWrapper是一个可以拦截对输出流的所有调用的类
public class MyResponseWrapper implements HttpServletResponse {
private HttpServletResponse response;
private ServletOutputStream outputStream;
private MyOutputStreamCopier myOutputStreamCopier;
public MyResponseWrapper(HttpServletResponse response) {
this.response = response;
}
// Implements all needed methods
// Write methods like the following to redirect output to your logs
public ServletOutputStream getOutputStream() throws IOException {
if (outputStream == null) {
outputStream = getResponse().getOutputStream();
copier = new MyOutputStreamCopier(outputStream);
}
return copier;
}
}
其中MyOutputStreamCopier
是扩展ServletOutputStream
的自定义类,并将所有写入复制到本地缓冲区(或直接将其记录到日志文件中)。
如果您喜欢已构建的解决方案,请查看此link