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

时间:2014-10-13 13:16:29

标签: java servlets response

当我注意到某个Web应用程序存在调用resonse.getWriter()并向其输出的情况时,此PrintWriter永远不会被刷新或关闭。

没有进一步的写入,所以我可以安全地冲洗或关闭它。应用程序似乎在没有关闭编写器的情况下正常工作,并且在org.apache.catalina.connector.CoyoteAdapter中无论如何都调用了finishResponse()/finishRequest(),但这是tomcat的内部工作方式,似乎依赖于错误。

关闭作者似乎是错误的,因为我不确定我是否真的用response.getWriter()调用打开了作者。 (通常不认为)

法拉盛似乎更像是一个好主意,但我确信这是否被认为是'正确'的方式。

没有做任何冲洗或关闭,感觉我在某些情况下可能会泄漏资源。

1 个答案:

答案 0 :(得分:7)

您不需要flush()close() Writer

这是Servlet 3.1规范所说的内容:

  

5.6关闭响应对象

     

当响应关闭时,容器必须立即刷新所有响应   将响应缓冲区中的内容留给客户端。下列   事件表明servlet满足了请求和那个   响应对象将被关闭:

     
      
  • 终止servlet的服务方法。
  •   
  • 诸如此类
  •   

由此我们可以推断,当服务方法返回或由于异常而终止时,应该刷新响应

我无法找到任何明确说明您不需要close()响应作者的内容。但是,由于Web容器管理套接字,因此在请求生命周期(或连接生命周期......如果使用持久连接)时不能正确关闭它们将是疯狂的。因此,我认为如果你忽略了调用close(),就可以安全地假设不会出现资源泄漏。 (当然,没有一个设计良好的网络容器。)


另一方面,如果您知道编写器或输出流是当前请求的响应流/写入器,则在请求处理结束时,您的servlet代码刷新和/或关闭它们是没有害处的。