1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

  在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。

  具体的原因就是:
  在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码

1 finally {
2       if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
3 }

  这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。

  然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--将jsp内的所有空格和回车符号所有都删除掉),在使用完输出流以后调用以下两行代码即可:

1 out.clear();
2 out = pageContext.pushBody();

  最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)

 imag.jsp

 1  <%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
 2  <%@ page import="java.io.OutputStream" %>
 3  <%!
 4    Color getRandColor(int fc,int bc){
 5      Random random = new Random();
 6      if(fc>255) fc=255;
 7      if(bc>255) bc=255;
 8      int r=fc+random.nextInt(bc-fc);
 9      int g=fc+random.nextInt(bc-fc);
10      int b=fc+random.nextInt(bc-fc);
11      return new Color(r,g,b);
12    }
13  %>
14  <%
15    try{
16      response.setHeader("Pragma","No-cache");
17      response.setHeader("Cache-Control","no-cache");
18      response.setDateHeader("Expires", 0);
19      int width=60, height=20;
20      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
21      OutputStream os=response.getOutputStream();
22      Graphics g = image.getGraphics();
23      Random random = new Random();
24      g.setColor(getRandColor(200,250));
25      g.fillRect(0, 0, width, height);
26
27      g.setFont(new Font("Times New Roman",Font.PLAIN,18));
28      g.setColor(getRandColor(160,200));
29      for (int i=0;i<155;i++){
30        int x = random.nextInt(width);
31        int y = random.nextInt(height);
32        int xl = random.nextInt(12);
33        int yl = random.nextInt(12);
34        g.drawLine(x,y,x+xl,y+yl);
35      }
36      String sRand="";
37      for (int j=0;j<4;j++){
38        String rand=String.valueOf(random.nextInt(10));
39        sRand+=rand;
40        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
41        g.drawString(rand,13*j+6,16);
42      }
43      session.setAttribute("rand",sRand);
44      g.dispose();
45
46      ImageIO.write(image, "JPEG",os);
47      os.flush();
48      os.close();
49      os=null;
50      response.flushBuffer();
51      out.clear();
52      out = pageContext.pushBody();
53    }catch(IllegalStateException e){
54       System.out.println(e.getMessage());
55      e.printStackTrace();
56    }
57   %>

  如有不足之处,欢迎斧正!

2.getOutputStream() has already been called for this response问题的解决
  在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception

  原因一:
  JSP默认的输出流为PrintWriter ,即<% %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%><%中的任何东西(包括HTML标签,空格,回车等东西)应该就可以。对于这样的情况应该这样来解决,删除%><%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句response.reset()。
  原因二:    
  在J2EE的API参考里有这么个:

  ServletResponse的getWriter()方法里会抛出这个异常:

    IllegalStateException - if the getOutputStream method has already been called for this response object

  而它的getOutputStream()方法里会抛出这个异常:

    IllegalStateException - if the getOutputStream method has already been called for this response object

  并且两者的函数申明里都有这么样的一句
    Either this method or getOutputStream() may be called to write the body, not both.
    Either this method or getWriter() may be called to write the body, not both.

  以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式
  OutputStream output=response.getOutputStream();
  while((len=in.read(b)) >0) {
    output.write(b,0,len);
  }
output.flush();
而不是把response.getOutputStream().write()放到循环体内

在页面中直接写:
<body bgcolor="#ffffff">
<h1>
<%
response.getOutputStream();
%>
</h1>
</body>
将会出现错误消息如下:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)

转载于:https://www.cnblogs.com/jorton/archive/2012/05/04/2482609.html

getOutputStream() has already been called for this response异常的原因和解决方法[转]相关推荐

  1. tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...

    tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 [标  题]:tomcat5下js ...

  2. getOutputStream() has already been called for this response异常的原因和解决方法

    今天在调试一个小web项目时,验证码不显示了,而且后台报错 getOutputStream() has already been called for this response 经过查找得知: 在t ...

  3. getOutputStream() has already been called for this response 当前响应已经调用了方法getOutputStream()

    getOutputStream() has already been called for this response 当前响应已经调用了方法getOutputStream() 如果遇到这个问题,一般 ...

  4. python write函数输出字体有颜色_跪求response.write输出字体颜色解决方法

    测试结果 测试结果 您的答案: on error resume next dim strsqa,ra strsqa="select * from topic2" set ra=db ...

  5. 解决java.lang.IllegalStateException: getOutputStream() has already been called for this response

    简单的说:用了流之后关掉即可. 下面详细说明: 出现了java.lang.IllegalStateException: getOutputStream() has already been calle ...

  6. 解决getOutputStream() has already been called for this response[java io流]

    getOutputStream() has already been called for this response 以上异常出现的原因和解决方法: jsp中出现此错误一般都是在jsp中使用了输出流 ...

  7. Easyexcel异常处理:getOutputStream() has already been called for this response

    文章目录 异常日志 源码位置 异常原因 异常前代码 调整后代码 异常日志 java.lang.IllegalStateException: getOutputStream() has already ...

  8. getOutputStream() has already been called for this response

    错误日志里偶尔会有getOutputStream() has already been called for this response这个错误 最近发现了高概率复现条件,所以顺手解决了一下: 首先根 ...

  9. java.lang.IllegalStateException: getOutputStream() has already been called for this response

    在做报表导出的时,导出报表后服务器提示: java.lang.IllegalStateException: getOutputStream() has already been called for ...

最新文章

  1. TVM图优化与算子融合
  2. GDC-Client使用
  3. python3.x中的生成器generator调用next方法
  4. sdut 2088 数据结构实验之栈与队列十一:refresh的停车场
  5. svn is already under version control问题解决
  6. 欧几里德算法求最大公约数
  7. 虚拟服务器声卡,如何使用虚拟声卡?虚拟声卡安装教程!
  8. 什么是事件?JS中都有哪些事件?
  9. 绩效管理KPI指标体系设计:142页KPI设计思路与实施实践
  10. 一些oracle基础
  11. KISSsoft03-2018F SP6,计算和重新分析机器零件
  12. JavaScript/JS闭包理解
  13. Paraview使用指南
  14. ETH2.0 Serenity中网络的详细介绍
  15. U-Boot 之三 详解使用 eclipse + J-Link 进行编译及在线调试
  16. 关于国产化系统银河麒麟(Kylin)的问题记录--持续更新
  17. d盘格式化后怎么恢复
  18. 【STM32】时钟系统RCC
  19. 图解快速排序——通俗易懂(quick sort)
  20. 怎样用UltraISO制作U盘系统安装盘

热门文章

  1. 200多个恶意NPM程序包针对Azure 开发人员,发动供应链攻击
  2. 看我如何利用教科书级别的释放后使用漏洞(CVE-2020-6449)
  3. 奇安信代码安全实验室帮助微软修复多个高危漏洞,获官方致谢
  4. 黑客可利用 TeamViewer 缺陷远程窃取系统密码
  5. Oracle不打算修复这两个iPlanet信息泄漏和注入漏洞
  6. JavaScript随机数的应用
  7. Java:Overriding与Overloading
  8. JAVA获取IP地址以及对应的地区
  9. 25_android下文件访问的权限
  10. cocos2dx 魔塔项目总结(一)