使用 ResposeWrapper 的响应过滤器

Response Filters using ResposeWrapper

我遇到了一段代码,它在将 servlet 输出返回给用户之前将其压缩,它使用自定义 ServletResponseWrapper - 如果你知道我在说什么,它就会非常有名 - 我的问题是:

1 - 现在拦截响应的功能完全由响应包装器负责 - 通过覆盖它的输出流 returns - 而过滤器对这种行为没有影响?我说得对吗?

2- 如果过滤器拦截其请求的任何 servlet 关闭输出流,会发生什么情况,chain.doFilter() 之后的代码是否能够再次使用该流?过滤器会起作用吗?

3 为什么包装响应解决了 "output returns directly to the container before being intercepted by the filter" 的问题...我的意思是为什么对响应的控制然后返回到过滤器?

我最近在我的项目中使用了本书中的示例代码: Professional Java for Web Applications。第 9 章中有一个很好的压缩过滤器示例。

我与本书背后的公司无关。

这些是您问题的答案:

  1. 是的,你是对的。过滤器用包装器包装原始 HttpServletResponse ,从这一刻起,包装器负责管理输出流(但不负责关闭流)。
  2. 无论您是否使用包装 HttpServletResponse,在您自己的代码中关闭输出流都不是一个好主意。
  3. 对输出流的控制没有返回给过滤器。您的 Web 应用程序在 chain.doFilter() 之后的行中继续执行,如果需要,您可以将一些数据写入包装的响应。但是不要关闭流,无论是在您的过滤器中,还是在您的 servlet 中。