【问题标题】:Should filters write to the response during or after filtering?过滤器应该在过滤期间还是之后写入响应?
【发布时间】:2023-03-05 00:54:01
【问题描述】:

我有一个过滤器,它处理生成的 HTML 并重写某些元素。例如,它将类属性添加到某些锚点。最后,它将处理后的 HTML 写入响应(HttpServletResponseWrapper 的子类)。自然,这意味着处理后的 HTML 在通过过滤器后的长度不同。

我可以看到两种解决方法。

一种是遍历 HTML,使用 StringBuilder 构建处理后的 HTML,并在所有过滤完成后将处理后的 HTML 写入响应。 另一种是遍历 HTML,但在处理完每个元素后立即将其写入响应。

哪种方法更适合此操作,或者是否有其他更好的选择?我希望主要减少临时内存使用量。

【问题讨论】:

  • 你确定这是你想要在服务器端做的事情吗?解析 html 可能会变得丑陋。
  • 是的——也许我给出的例子很糟糕。它还重写了资源的 URL,所以我不能在客户端上这样做。是的,过滤器很丑。

标签: java response servlet-filters


【解决方案1】:

流式传输响应(即“随时随地”编写)的复杂性在于代码结构:您的处理必须使得响应字节按适当的顺序获得。但是,如果您在 StringBuilder 中组装响应,那么您的代码已经适合流式传输。只需将StringBuilder 替换为ServletResponse.getWriter() 方法返回的PrintWriter

请注意,在 HTTP 1.0 中,HTTP 服务器必须在响应标头中提供内容长度,或者在响应结束时关闭连接。 HTTP 1.1 包括“分块传输编码”,它允许数据流传输而无需事先知道内容长度,并且不会阻止连接被重用于后续 HTTP 请求。这应该是自动处理的,因此您不必担心,除非您尝试支持非常老的 HTTP 客户端。

【讨论】:

    【解决方案2】:

    显然,第二种方法需要更少的内存并提高响应能力,但通常更难以实施。

    【讨论】:

      猜你喜欢
      • 2019-02-20
      • 2014-12-14
      • 2011-07-03
      • 2020-03-15
      • 2021-08-26
      • 1970-01-01
      • 2011-08-03
      • 2019-05-20
      • 2015-11-04
      相关资源
      最近更新 更多