- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试记录(为了简单起见,现在只是为了控制台编写)将由 HttpServletResponse 返回的最终呈现的 HTML。 (即主体)为此,我使用 Spring MVC 中的 HandlerInterceptorAdapter,如下所示:
public class VxmlResponseInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(response.toString());
}
}
这按预期工作,我在控制台中看到了 HTTP 响应 header 。我的问题是,是否有一种相对简单的方法可以将整个响应正文(即最终呈现的 HTML)记录到控制台,而不必使用 PrintWriters、OutputStream 等进行跳跃。
提前致谢。
最佳答案
最好使用 Servlet Filter
而不是 Spring HandlerInterceptor
,因为允许 Filter
替换请求和/或响应对象,您可以使用此机制将响应替换为记录响应输出的包装器。
这将涉及编写 HttpServletResponseWrapper
的子类,覆盖 getOutputStream
(也可能还有 getWriter()
)。这些方法将返回 OutputStream
/PrintWriter
实现,这些实现将响应流虹吸到日志中,除了发送到其原始目的地。一个简单的方法是使用 TeeOutputStream
来自 Apache Commons IO ,但自己实现并不难。
这是你可以做的事情的一个例子,利用 Spring 的 GenericFilterBean
和 DelegatingServletResponseStream
,以及 TeeOutputStream
,让事情变得更容易:
public class ResponseLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response);
filterChain.doFilter(request, responseWrapper);
}
private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) {
return new HttpServletResponseWrapper(response) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new DelegatingServletOutputStream(
new TeeOutputStream(super.getOutputStream(), loggingOutputStream())
);
}
};
}
private OutputStream loggingOutputStream() {
return System.out;
}
}
这会将所有内容记录到 STDOUT。如果你想记录到一个文件,它会变得更复杂,确保流被关闭等等,但原理是一样的。
关于java - 使用 Spring MVC HandlerInterceptorAdapter 从 HttpServletResponse 记录响应正文 (HTML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2158647/
请帮助 Spring MVC 新手。我很难做 HandlerInterceptorAdapter工作。 这是代码和配置文件。 mvc-dispatcher-servlet.xml:
之前的设计 我有一个如下构建的 Spring Controller : @RequestMapping(value = "/rest/funf/{datatype}", method = Reques
我正在尝试为我的 JSON 网络服务创建一个验证系统。这个想法是让一个拦截器捕获每个 Json @RequestBody,通过 JacksonMapping 用它创建一个 JSON 对象。然后从中读取
假设我有一些 FooInterceptor: public class FooInterceptor extends HandlerInterceptorAdapter { // ... } 在
可以使用 Zuul 配置添加 HandlerInterceptorAdapter。我需要拦截对特定资源的请求,但我想因为我有 Zuul 过滤器配置,所以拦截器永远不会被调用。 可以这样做吗? 最佳答案
我有一个扩展HandlerInterceptorAdapter的类: public class AreaRiservataInterceptorAdapter extends HandlerInter
我的 Spring MVC Web 应用程序在页面顶部有一个导航菜单,其中包含指向项目列表的链接。从数据库中检索项目列表。此菜单对应用程序中的所有页面都是通用的。目前,在每个 Controller 中
我目前有两个处理类似功能的拦截器。我想合并这些。 一个拦截器是一个访问请求记录器,它显示登录的用户、 session ID 和请求的 URL。 另一个拦截器是进程时间记录器。 访问记录器为了记录所有必
我试图将正文从 request.getReader() 中拉出来,但它已经被读取了。 我怎样才能得到拦截器中的请求体? 最佳答案 如您所说,请求正文只能从Reader 中读取一次。这不是特定于拦截器,
目前我正在从 Jersey 迁移到 Spring MVC,需要提供相同的行为和功能。 在以前的情况下,我们有一个 Jersey ContainerRequestFilter 来注册 Prometheu
我创建了一个自定义 HandlerInterceptorAdapter覆盖 postHandle方法: public class AcmeInterceptor extends HandlerInte
我正在尝试将授权 header 添加到我的请求中,作为我们在切换环境时的临时解决方法。我正在尝试在扩展 HandlerInterceptorAdapter 的拦截器中处理它。 我使用了 Mutable
这个问题在这里已经有了答案: Why is my Spring @Autowired field null? (21 个回答) 关闭8年前。 我在尝试 @Autowire 我的 @Service 时遇
我正在开发 Spring Web 服务。我想测试我的端点,但由于某种原因,我在运行测试时总是遇到以下异常: Caused by: org.springframework.beans.factory.N
我正在尝试记录(为了简单起见,现在只是为了控制台编写)将由 HttpServletResponse 返回的最终呈现的 HTML。 (即主体)为此,我使用 Spring MVC 中的 HandlerIn
在我的 Spring Boot 应用程序中,我试图在 afterCompletion() 中的响应中添加 header 我的方法HandlerInterceptorAdapter类。 Controll
我想在 session 超时时执行一些 Activity ,我使用了 HandlerInterceptorAdapter,如下所示 package com.practice.security; imp
我正在尝试记录(为了简单起见,现在只是为了控制台编写)将由 HttpServletResponse 返回的最终呈现的 HTML。 (即主体)为此,我使用 Spring MVC 中的 HandlerIn
经过长时间调试我的应用程序后,我发现了一些对我来说毫无意义的东西。每当我调用如下例所示注释的 Controller 时,我的拦截器就会执行两次。 @RequestMapping(method = Re
我有将 JSON 返回给客户端的 Controller 。 Controller 方法使用 mvc 注释进行标记,例如: @RequestMapping("/delete.me") public @R
我是一名优秀的程序员,十分优秀!