Response.getWriter()应该被关闭/刷新吗?

6
当我注意到一个Web应用程序中存在resonse.getWriter()被调用并输出内容的情况时,这个PrintWriter通常不会被刷新或关闭。
因为没有进一步的写操作,所以可以安全地进行刷新或关闭。尽管在org.apache.catalina.connector.CoyoteAdapter中会调用finishResponse()/finishRequest()方法,但是这只是Tomcat的内部工作,依赖于此似乎是错误的。
关闭writer似乎不对,因为无法确定是否实际上使用了response.getWriter()调用开启了writer(通常不是)。
刷新似乎更合理一些,但我不确定这是否被认为是“正确”的方式。
在某些情况下不做任何刷新或关闭可能会导致资源泄漏。

冲洗和关闭是最佳实践,那么问题是什么? - Gurkan İlleez
1
根据下面的答案,这并不是必需的。然而,如果您正在进行多路径servlet响应,可能会写入不同类型的内容,使用close()将有助于调试,以防在关闭后尝试向其写入内容。 - Compass
1个回答

10

您不需要调用flush()close()方法来关闭Writer

Servlet 3.1规范中如下规定:

  

5.6响应对象的关闭

     

当响应被关闭时,容器必须立即将响应缓冲区中的所有剩余内容刷新到客户端。以下事件表明servlet已满足请求并且响应对象将被关闭:

     
      
  • servlet的service方法终止。
  •   
  • 等等
  •   

从这可以推断出,当服务方法返回或由于异常终止时,应该刷新响应。

我没有找到任何明确说明不需要close()响应Writer的内容。但是,由于Web容器管理套接字,因此在请求生命周期(或连接生命周期...如果使用持久连接)的某个点上正确关闭它们肯定是合理的。因此,我认为如果忽略调用close(),也不会有资源泄漏。(对于设计良好的Web容器来说肯定如此。)


另一方面,如果您确定写入器或输出流是当前请求的响应流/写入器,则在请求处理结束时刷新和/或关闭它们也没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接