- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 Java Spring 开发的 RESTful 服务。我创建了一些用于身份验证的过滤器,在我需要记录传入请求和传出响应的过滤器之一中获取一些自定义 header 等。现在我一直在记录响应。这是过滤器
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException
servletResponse
是我需要获取内容的对象。
我知道有一些重复的问题已经得到解答,但由于某种原因,这些问题都不适合我。
我有一个filter
并在 doFilter
chain.doFilter
之后的方法我想记录响应内容。
我可以看到JSON
当我检查 response
时对象在outputStream
或在 writer
。但我无法以编程方式获取它。
有人可以帮我解决这个问题吗?预先感谢您!
以下是我使用过但没有帮助的链接:
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
最佳答案
对于自定义解决方案,这就是想法。
在过滤器中,您需要包装响应并拦截 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
关于java - 获取用于记录的 ServletResponse 内容字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203284/
这个问题已经有答案了: How to read and copy the HTTP servlet response output stream content for logging (6 个回答)
javax.servlet.Servlet有什么好的理由 void service(ServletRequest req, ServletResponse res) 方法将 ServletRespon
我正在使用 Tomcat。 ServletResponse.flushBuffer 的文档说,“强制将缓冲区中的任何内容写入客户端。调用此方法会自动提交响应,这意味着状态代码和 header 将是写的
如果我调用 ServletResponse.flushBuffer() , 我需要打电话吗 ServletResponse.getOutputStream().close() 和/或 ServletR
标题几乎不言自明,但始终检查 ServletResponse 类型的 isCommitted() 是否有值(value)?我的具体示例是使用过滤器,如果用户无权执行特定操作(具体为 CSRF 检查),
根据文档,ServletResponse 接口(interface)的setContentLength(int len) 方法设置响应中内容主体的长度 在 HTTP servlet 中,此方法设置HT
关于优化我为将 StringBuilder 的全部内容写入 ServletResponse 而创建的方法,我想获得一些意见。 我这样做是为了避免在将其传递给 out.write() 方法之前一次性创建
这个问题已经有答案了: How to mock void methods with Mockito (11 个回答) 已关闭 7 年前。 这是我的 servlet 代码: String foo = "
我是 servlet 的新手,正在阅读一些有关过滤器和包装器的文章。我能理解过滤器,但对包装器感到困惑。在书中,作者举了一个例子: 如果没有包装器: public void doFilter(Serv
我在 Tomcat 中并且有一个包含 JSP 内容的字符串。我尝试获取 HttpServletResponse 意味着 HTML 输出。在正常情况下,您调用 JSP,WebContainer 将其转换
我正在使用 ServletResponse.setBufferSize 增加响应的缓冲区大小,但 Tomcat 7 仍然抛出缓冲区大小不够大的异常。这是 Tomcat 7.0.32 中的错误吗? 这是
我想知道 ServletResponse.reset() 是否是我需要阻止未登录用户访问 servlet 的额外步骤,或者它是否存在风险或缺点。 背景: 方式my website有效,最初用户只能在创
我已经成功设置了 httpServletResponse().setHeader("custtype", "permanent") 但是当我尝试检索它时 httpServletResponse().g
我正在尝试报告从我的 web 应用返回的每个 HTTP 状态代码。但是,状态代码似乎无法通过 ServletResponse 访问,或者即使我将其转换为 HttpServletResponse。有没有
如何使用 JUnit 正确覆盖过滤器? @SlingFilter(order = -700, scope = SlingFilterScope.REQUEST) public class Loggin
为什么 Servlet 接口(interface)中的 service() 方法不返回 ServletResponse 的实例,而是在 ServletResponse 上工作 容器提供的对象? 简单来
这个问题已经有答案了: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? (6 个回答)
多年来我一直在编写 servlet 和过滤器,这一直让我有点厌烦 - 检查和转换 ServletRequest 和 ServletResponse 参数到 HttpServletRequest 和 H
我是一名优秀的程序员,十分优秀!