【问题标题】:Can "getOutputStream() has already been called for this response" cause server crash?“getOutputStream() 已经为此响应调用”会导致服务器崩溃吗?
【发布时间】:2014-05-27 21:38:28
【问题描述】:

我一直在研究 SO 关于异常

getOutputStream() has already been called for this response

我基本上知道这可能是由于一个HttpServletResponse调用getWriter()和getOutputStream()造成的,因为混合文本和其他MIME类型一起返回给客户端。

但是,我不确定这个异常是否会发生,如果重复发生,会导致服务器崩溃吗? (因为缓冲区中的数据被getWriter() 或getOutputStream() 变成了ghost)?

【问题讨论】:

  • 通常的原因是在打印了一些内容(甚至是空格)之后尝试在 JSP 中调用 getOutputStream()。只需使用显式 servlet。

标签: java spring jsp jakarta-ee


【解决方案1】:

这是IllegalStateException,这是RuntimeException。

RuntimeException 是一个unchecked 异常,根本不会导致系统/服务器崩溃。


如何避免java servlet中的IllegalStateException?

IllegalStateException 异常的根本原因是 java servlet 在响应提交后试图写入输出流(响应)。

最好确保在转发或重定向完成后不向响应中添加任何内容以避免IllegalStateException。可以通过在 forward 或 redirect 语句旁边包含 return 语句来完成。


更多解决方案请查看JSP-Servlet Q&A » Development » IllegalStateException

【讨论】:

    【解决方案2】:

    我会说这取决于 servlet 容器,但通常 servlet 代码中的异常不会导致整个服务器崩溃。

    如果您担心这里可能存在内存泄漏,在这种情况下也不太可能发生。此例外只是合同执行。 servlet 容器告诉您应该使用 getOutputStream() 或 getWriter() 但在单个请求期间不要同时使用两者。

    【讨论】:

    • 如果此错误触发的不仅仅是日志中的堆栈跟踪和对用户代理的 500 响应(或部分响应,如果已提交),我会感到惊讶。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2012-12-14
    • 2016-03-03
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多