You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat中出现java.lang.IllegalStateException异常请求排查

解决Tomcat中java.lang.IllegalStateException: getOutputStream() 已对此响应调用异常

嘿,这个异常我太熟了!你遇到的java.lang.IllegalStateException: getOutputStream() 已对此响应调用,本质原因是HTTP响应的二进制输出流和字符输出流不能同时使用——Tomcat明确禁止在同一个请求里既调用response.getOutputStream()(处理图片、文件这类二进制内容)又调用response.getWriter()(处理HTML、文本这类字符内容),调用其中一个后,另一个就会抛出这个异常。

从你提供的服务器日志能看出,异常是在JSP对应的servlet中触发的,说明问题大概率出在JSP本身或者转发到JSP的Servlet代码里,给你列两个最常见的场景和对应的解决办法:

  • 场景1:JSP页面中手动调用了response.getOutputStream()
    JSP编译成Servlet后,默认会自动调用response.getWriter()来输出页面的HTML内容。如果你在JSP里自己写了输出二进制内容的代码(比如输出图片、下载文件),手动调用了getOutputStream(),就会和默认的字符流调用冲突。
    ✅ 解决办法:

    • 优先把输出二进制内容的逻辑放到单独的Servlet中处理,JSP的定位就是渲染HTML页面,别让它干不属于它的活。
    • 实在要在JSP里处理的话,调用完getOutputStream()输出内容后,立刻执行response.flushBuffer();然后加上return;,终止JSP后续的渲染流程,避免触发默认的getWriter()调用。
  • 场景2:Servlet输出流未处理完成就转发到JSP
    如果你的业务逻辑是先在Servlet里用getOutputStream()输出了内容,然后又通过forward转发到JSP页面,这时候JSP要输出HTML就会调用getWriter(),直接触发异常。
    ✅ 解决办法:

    • 在Servlet里输出完二进制内容后,务必关闭输出流(outputStream.close())或者提交响应(response.flushBuffer()),然后直接return;,不要再执行转发到JSP的代码。
    • 如果需要跳转到JSP页面,确保这个Servlet没有调用过getOutputStream()或者getWriter()。

你的服务器错误日志如下:

08-May-2018 12:00:07.460 SEVERE [https-jsse-nio-8443-exec-1] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() 针对 servlet [jsp] 抛出异常 java.lang.IllegalStateException: getOutputStream() 已对此响应调用 at org.apache.catalina.connector.Response.getWriter(Response.java:624) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) at javax.servlet.ServletResponseWra...

内容的提问来源于stack exchange,提问作者Created By lucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:09:13