使用 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 章中有一个很好的压缩过滤器示例。
我与本书背后的公司无关。
这些是您问题的答案:
- 是的,你是对的。过滤器用包装器包装原始
HttpServletResponse
,从这一刻起,包装器负责管理输出流(但不负责关闭流)。
- 无论您是否使用包装
HttpServletResponse
,在您自己的代码中关闭输出流都不是一个好主意。
- 对输出流的控制没有返回给过滤器。您的 Web 应用程序在
chain.doFilter()
之后的行中继续执行,如果需要,您可以将一些数据写入包装的响应。但是不要关闭流,无论是在您的过滤器中,还是在您的 servlet 中。
我遇到了一段代码,它在将 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 章中有一个很好的压缩过滤器示例。
我与本书背后的公司无关。
这些是您问题的答案:
- 是的,你是对的。过滤器用包装器包装原始
HttpServletResponse
,从这一刻起,包装器负责管理输出流(但不负责关闭流)。 - 无论您是否使用包装
HttpServletResponse
,在您自己的代码中关闭输出流都不是一个好主意。 - 对输出流的控制没有返回给过滤器。您的 Web 应用程序在
chain.doFilter()
之后的行中继续执行,如果需要,您可以将一些数据写入包装的响应。但是不要关闭流,无论是在您的过滤器中,还是在您的 servlet 中。