当前位置: 首页 > 面试题库 >

Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?

宰修能
2023-03-14
问题内容

我无法通过一些Google搜索找到权威的答案。在Java Servlet中,可以通过response.getOutputStream()或response.getWriter()访问响应主体。写入流后,是否应该在此流上调用.close()?

一方面,Blochian鼓励始终关闭输出流。另一方面,我不认为在这种情况下有需要关闭的基础资源。套接字的打开/关闭在HTTP级别进行管理,以允许诸如持久连接之类的事情。


问题答案:

通常,你不应该关闭流。在Servlet完成作为Servlet请求生命周期的一部分运行之后,Servlet容器将自动关闭流。

例如,如果你关闭流,那么在实现Filter的情况下将不可用。

说了这么多,只要你关闭它,只要你不尝试再次使用它,都不会发生任何不良情况。

编辑:另一个筛选器链接

EDIT2:adrian.tarau是正确的,因为如果你想在Servlet完成其操作后更改响应,则应创建一个扩展HttpServletResponseWrapper的包装器并缓冲输出。这是为了防止输出直接进入客户端,还允许你保护servlet是否关闭流,如以下摘录(强调我的话):

修改响应的过滤器通常必须 在将响应返回给客户端之前捕获该响应。实现此目的的方法是将生成响应的servlet传递给替代流。替身流阻止servlet在完成时关闭原始响应流,并允许过滤器修改servlet的响应。



 类似资料:
  • 我使用GlassFish作为服务器和Netbean IDE 8.0这是我的项目结构。 我的程序如何工作: 客户端开放本地主机:8080/啤酒 她/他选择了一杯啤酒(在index.html中) 它将发布到BeerSelect。java(简称BS) BS会打电话给BeerExpert。然后调用result。最终发送测试的jsp。jar到客户端 以下是BS中的重要代码。

  • 这是在创建持久订阅的上下文中。 DefaultMessageListenerContainer中有一个setClientId(),SingleConnectionFactory中有一个。 我的理解是: < li >长期订阅适用于消费者/订户。 < li >不同的消费者应该能够使用不同的客户端id。 < li >不同的消费者应该能够共享一个连接。 < li >每个使用者有一个(ListenerCon

  • 使用jackson回写响应时发生异常。在网上找不到任何解决方案。我不确定错误的原因是什么。尝试刷新响应,但仍然是相同的错误 下面是堆栈跟踪:

  • 我正在尝试使用以下代码段在浏览器中打开pdf文件: 我收到以下错误: 我还尝试使用以下方式关闭: 有人能帮我吗?

  • 问题内容: 我在Objective-C中使用过这种结构: Python是否也应该为调用父类的实现? 对和也是正确/错误吗? 问题答案: 在Python中,调用超类是可选的。如果调用它,那么使用标识符还是显式命名超类也是可选的: 对于对象,由于super方法为空,因此不必严格要求调用super方法。相同。 另一方面,对于,您确实应该调用super方法,并将其return用作新创建的对象-除非您明确希

  • 在数千项从字符串转换为int的循环中,在调用Integer之前应该检查字符串是否为空。parseInt或应直接依赖NumberFormatException移动到下一个?