Servlets 在筛选器中的chain.doFilter之后发送响应

Servlets 在筛选器中的chain.doFilter之后发送响应,servlets,response,wrapper,servlet-filters,Servlets,Response,Wrapper,Servlet Filters,我是个新手。我现在读的书中写到,我们需要包装,因为在完成chain.doFilter()method之后,对响应进行任何处理都为时已晚,因为响应已经发送 我编写了以下Servlet和过滤器: public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOEx

我是个新手。我现在读的书中写到,我们需要包装,因为在完成
chain.doFilter()
method之后,对响应进行任何处理都为时已晚,因为响应已经发送

我编写了以下Servlet和过滤器:

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        PrintWriter writer = response.getWriter();
        writer.println("In Servlet");
    }
}

public class MyFilter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException{
        PrintWriter writer = response.getWriter();
        chain.doFilter(request, response);
        writer.println("After chain");
    }
}
我在浏览器中看到两个字符串。 我的问题是:为什么我们需要包装纸?即使在
chain.doFilter
之后,我仍然可以编写响应,并且我仍然可以看到结果


是因为响应分为两部分发送(第一部分在
chain.doFilter
的末尾,第二部分在
Filter.doFilter
的末尾)?因此,如果我必须压缩响应,它将无法正常工作(因为第一个未压缩的部分将被发送)

这本书讨论的是响应头

你把它误解为反应体

以下是响应包装器的一些实际使用案例,您可以了解我们可能需要它们的原因:


有关更多示例,请参阅。

请格式化代码,使其更具可读性。有关更多信息,请参见第页。