异常信息:{getOutputStream() has already been called for this response}
时间: 2023-11-22 17:46:02 浏览: 72
这个异常信息表示在同一个请求中,调用了两次response.getOutputStream()方法,或者先进行了response的头等信息设置后调用response.getOutputStream()。如果在这个方法之后又使用了response.getWriter()的相关操作,就会出现这个异常。这个异常通常发生在使用Servlet输出响应时。
相关问题
com.mdd.admin.config.aop.LogAspect - 异常信息:getOutputStream() has already been called for this response
这个异常信息通常是由于在同一个 HTTP 请求中多次调用了 `response.getOutputStream()` 方法导致的。
在一个 HTTP 请求中,通常只能调用一次 `response.getOutputStream()` 方法来获取输出流,否则就会抛出上述异常。这是因为在获取输出流后,Servlet 容器会自动向客户端发送 HTTP 头信息,如果再次获取输出流,则会尝试向客户端发送重复的 HTTP 头信息,从而导致异常。
解决这个问题的方法是避免重复调用 `response.getOutputStream()` 方法。如果需要多次向输出流中写入数据,可以使用缓冲流来实现,例如:
```
ServletOutputStream out = response.getOutputStream();
BufferedOutputStream buff = new BufferedOutputStream(out);
// 第一次写入数据
buff.write(data1);
buff.flush();
// 第二次写入数据
buff.write(data2);
buff.flush();
// ...
```
在上述代码中,我们先获取 `response.getOutputStream()` 方法返回的输出流,然后再使用 `BufferedOutputStream` 对其进行包装,以便实现多次向输出流中写入数据的操作。在每次写入数据后,我们需要调用 `flush()` 方法来将数据刷新到底层流中,以便确保数据及时发送到客户端。
另外,如果在使用缓冲流时遇到异常,也需要及时关闭缓冲流和输出流,以避免资源泄漏。
IllegalStateException: getOutputStream() has already been called for this response
回答: 这个异常通常是因为在web容器生成的servlet代码中同时调用了response.getOutputStream()和response.getWriter()引起的冲突。根据Servlet规范,在调用response.getOutputStream()之前,需要清空缓存的内容,并返回一个新的BodyContext,然后更新PageContext的out属性的内容。所以在你提供的代码中,可以看到在调用response.getOutputStream()之前,先使用out.clear()清空缓存的内容,并使用pageContext.pushBody()更新PageContext的out属性的内容。这样可以避免IllegalStateException的发生,并正常输出图片到response的输出流中。
阅读全文