【问题标题】:Response Filters using ResposeWrapper使用 ResposeWrapper 的响应过滤器
【发布时间】:2016-02-22 22:59:32
【问题描述】:

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

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

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

3 为什么包装后的响应解决了“输出被过滤器拦截之前直接返回容器”的问题...我的意思是为什么对响应的控制然后返回给过滤器?

【问题讨论】:

    标签: servlets jakarta-ee filter gzip httpresponse


    【解决方案1】:

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

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

    这些是您问题的答案:

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

    【讨论】:

    • 为什么不关闭流?
    • 因为关闭属于容器的责任。不要害怕容器忘记关闭流 ;-)
    • 我的意思是,它真的会影响过滤器的行为吗?我读了 n stackoverflow 说它不允许过滤器工作,但不知道这是否属实stackoverflow.com/questions/1159168/…
    • 在您链接的主题中,skaffman 及其 cmets 的答案是完美的。我还是说“不要关闭输出流。关闭是容器的工作。”
    • 如果您对我推荐的书中的代码示例有疑问,请告诉我。有一些小问题。
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2017-06-09
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多