过滤器在过滤期间或过滤后是否应写入响应?

时间:2010-04-21 15:22:30

标签: java response servlet-filters

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

我可以看到两种方法来解决这个问题。

一种是迭代HTML,使用StringBuilder构建处理过的HTML,并在完成所有过滤后将处理过的HTML写入响应。 另一种是迭代HTML,但只要处理完每个元素就将其写入响应。

哪种方法更适合此操作,还是有其他选择更可取?我期待主要减少临时内存使用量。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

显然,第二种方法需要更少的内存并且会提高响应速度,但实施起来往往更加困难。