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

【标  题】:tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法
【关键字】:tomcat5,jsp,getOutputStream,has,already,been,called,for,this,response
【来  源】:http://blog.csdn.net/alexwan/archive/2007/02/13/1508871.aspx

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

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

具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();

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

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*,java.io.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
        }
%>
<%
try {
 //设置页面不缓存
 response.setHeader("Pragma","No-cache");
 response.setHeader("Cache-Control","no-cache");
 response.setDateHeader("Expires", 0);
 
 OutputStream os = response.getOutputStream();
 
 // 在内存中创建图象
 int width=60, height=20;
 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 
 // 获取图形上下文
 Graphics g = image.getGraphics();
 
 //生成随机类
 Random random = new Random();
 
 // 设定背景色
 g.setColor(getRandColor(200,250));
 g.fillRect(0, 0, width, height);
 
 //设定字体
 g.setFont(new Font("Times New Roman",Font.PLAIN,18));
 
 //画边框
 //g.setColor(new Color());
 //g.drawRect(0,0,width-1,height-1);
 
 
 // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
 g.setColor(getRandColor(160,200));
 for (int i=0;i<155;i++)
 {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
         int xl = random.nextInt(12);
         int yl = random.nextInt(12);
  g.drawLine(x,y,x+xl,y+yl);
 }
 
 // 取随机产生的认证码(4位数字)
 String sRand="";
 for (int i=0;i<4;i++){
     String rand=String.valueOf(random.nextInt(10));
     sRand+=rand;
     // 将认证码显示到图象中
     g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
     g.drawString(rand,13*i+6,16);
 }
 
 // 将认证码存入SESSION
 session.setAttribute("rand",sRand);
 
 
 // 图象生效
 g.dispose();
 
 // 输出图象到页面
 ImageIO.write(image,  "JPEG" ,os);
 os.flush();
 os.close();
 os = null ;
 response.flushBuffer();
 out.clear();
 out  =  pageContext.pushBody();
}
catch (IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}

%>

posted on 2009-02-18 13:33 浙林龙哥 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/huqingyu/archive/2009/02/18/1393126.html

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

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

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

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

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

  3. (转载)tomcat5下jsp出现getOutputStream() has already been called for this

    (来自:http://guoyiqi.javaeye.com/blog/75929) tomcat5下jsp出现getOutputStream() has already been called fo ...

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

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

  5. linux 下搭建yolov3错误,yolov3---报段错误的可能原因及解决方法

    参考: ************************************************************************************************ ...

  6. python open找不到文件的原因_浅谈python在提示符下使用open打开文件失败的原因及解决方法...

    题目:在提示符下使用open打开一个文件 刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样. 错误如下: >>>open('d:\456 ...

  7. win7下计划任务schtasks使用详解及错误:无法加载列资源的解决方法1

    win7下计划任务schtasks使用详解及"错误:无法加载列资源"的解决方法1 2011-12-10 20:33 schtasks 命令简述: 安排命令和程序,使其定期运行或在指 ...

  8. [css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法

    [css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法 父元素塌陷父元素在文档流中高度默认是被子元素撑开的,当子元素脱离文档流以后,将无法撑起父元素的高度 ...

  9. /var/spool/clientmqueue目录下存在大量文件的原因及解决方法

    /var/spool/clientmqueue目录下存在大量文件的原因及解决方法 参考文章: (1)/var/spool/clientmqueue目录下存在大量文件的原因及解决方法 (2)https: ...

最新文章

  1. LA3602DNA序列
  2. 【推荐系统】基于图嵌入技术的推荐系统长文综述
  3. 第十七天:规划沟通管理
  4. mysql 修复表和优化表
  5. 有乳胶枕吗_乳胶枕怎么挑?网传的踩鸡蛋检测法,实际不靠谱
  6. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件
  7. html怎么设置自动音乐播放器,运用js教你轻松制作html音乐播放器
  8. 计蒜客 第一场 搜狗输入法
  9. mht转html保留图片,【JAVA】mht文件转html
  10. 啸叫抑制(howling suppression)
  11. yarn 错误There appears to be trouble with your network connection. Retrying
  12. 布朗大学计算机专业怎么样,布朗大学的计算机专业如何?
  13. apicloud——微信第三方登录、apple登录
  14. Jquery 浏览器调用高德地图进行导航
  15. 8寸Single机台喷淋去胶加工服务
  16. java软件工程师工作业绩_java工程师个人简历自我评价_JAVA软件工程师面试简历的自我评价...
  17. 004-JDK的下载和安装
  18. 使用四种框架分别实现1百万websocket常连接的服务器
  19. MPB:中农戴兆来组-​猪肠道微生物的体外培养与功能研究
  20. Spring核心组件详解(Bean、Context、Core)

热门文章

  1. 最全的C++面试题来啦!(来自各大一线互联网)
  2. java转换汇编,请问如何把JAVA程序转为汇编?
  3. vsm java_java – 我尝试使用JAXB将对象编组到xml文件中时,错误为“缺少@XmlRootElement注释”...
  4. idle不是python自带的开发工具_Python的开发工具
  5. cout不明确什么意思_劈腿什么意思?原来出轨和劈腿不一样!原来如此!
  6. everything安装版和便携版有什么区别_A2奶粉内幕:国行版和澳洲版有什么区别 贵的不一定好!...
  7. c++中 int, long long, double 等数据类型的长度及范围整理
  8. 【渝粤题库】陕西师范大学165107工作分析与设计作业(高起专)
  9. lr监控虚拟服务器,lr监控服务器 教程
  10. matlab中rb代表什么意思,你知道“川藏线上”女游客举着“求RB”的牌子是啥意思吗?暗语啊!...