CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

彩色验证码出现 getOutputStream() has already been called for this response,如何解决?谢谢

楼主sunnysnow(维雪)2005-12-22 09:28:04 在 Java / Web 开发 提问

getOutputStream()   has   already   been   called   for   this   response  
   
  改成serverlet怎么改。我用的是tomcat。 问题点数:100、回复次数:8Top

1 楼binny(骑个破车看夕阳)回复于 2005-12-22 09:39:07 得分 20

加上response.reset(),并且所有的%>后面不要换行,包括最后一个;  
  因为Application   Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,  
  而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,  
  就会发生:getOutputStream()   has   already   been   called   for   this   response的错误  
  详细请见《More   Java   Pitfill》一书的第二部分   Web层Item   33:试图在Servlet中使用两种输出机制   270  
  而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件  
  下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开Top

2 楼CalvinKyle(浮躁低能程序员)回复于 2005-12-22 09:45:28 得分 20

我将验证码的生成写在jsp里也出现了这样的问题,而且照楼上的说法也始终没有解决(看了jsp对应的.java,发现无论如何也避免不了回车的输出——我没有显示输出回车,可是容器将我的jsp生成java时自动给我加回车)  
   
  后来无奈,写在servlet里面就没有这个问题了Top

3 楼sunnysnow(维雪)回复于 2005-12-22 10:03:41 得分 0

请问楼上的,servlet是如何写的,能否把代码共享一下,谢谢!Top

4 楼octopus2027(章鱼)回复于 2005-12-22 11:28:15 得分 30

binny(骑个破车看夕阳)     的解答是正确的,我以前也碰过这种总是,后来把%><%之间的内容,全部删掉就OK了,包括最后一个%>的回车(习惯性会打回车)也要删掉,就OK了,再试一下吧,再不行就把源码发上来,也许有人能帮忙解决的.Top

5 楼jiahang8195(游客)回复于 2005-12-22 12:41:26 得分 20

我原来用jsp写也是,后来改成servlet就ok了  
   
  package   CMCC;  
  import   java.io.*;  
  import   java.awt.Color;  
  import   java.awt.Font;  
  import   java.awt.Graphics;  
  import   java.awt.GraphicsEnvironment;  
  import   java.awt.image.BufferedImage;  
  import   java.io.IOException;  
  import   java.util.Random;  
  import   javax.imageio.IIOImage;  
  import   javax.imageio.ImageIO;  
  import   javax.imageio.ImageWriter;  
  import   javax.imageio.plugins.jpeg.JPEGImageWriteParam;  
  import   javax.imageio.stream.ImageOutputStream;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
   
   
  public   class   VerifyCodeServlet   extends   HttpServlet  
  {  
            private   static   final   int   IMAGE_WIDTH   =   60;  
            private   static   final   int   IMAGE_HEIGHT   =   20;  
            private   static   final   int   FONT_HEIGHT   =   16;  
            private   static   final   String   SVG_SOURCE1   =   "<!DOCTYPE   svg   PUBLIC   \"-//W3C//DTD   SVG   1.0//EN\"   \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">"  
                    +   "<svg   width=\""  
                    +   IMAGE_WIDTH  
                    +   "\"   height=\""  
                    +   IMAGE_HEIGHT  
                    +   "\"   xmlns=\"http://www.w3.org/2000/svg\">"  
                    +   "<text   x=\"0\"   y=\""  
                    +   IMAGE_HEIGHT  
                    +   "\"   font-family=\"Arial\"   font-size=\""  
                    +   IMAGE_HEIGHT   +   "\"   fill=\"black\">";  
   
            private   static   final   String   SVG_SOURCE2   =   "</text></svg>";  
   
   
            private   boolean   svgMode   =   false;  
            private   PrintWriter   out   =   null;  
   
   
            protected   void   service(HttpServletRequest   arg0,   HttpServletResponse   arg1)   throws   ServletException,   IOException    
            {  
                    //if   (sn   ==   null)  
                            //   return;  
                               
                    String   vcode   =   sn2vcode();  
   
                    arg0.getSession().setAttribute("rand",vcode)   ;//代码内容写入session中  
   
                    if   (svgMode)  
                              outSVG(vcode,   arg1);  
                    else  
                              outJPEG(vcode,   arg1);  
            }  
   
   
            private   void   outSVG(String   vcode,   HttpServletResponse   resp)   throws   IOException    
            {  
                    resp.setContentType("image/svg+xml");  
                    resp.getOutputStream().print(SVG_SOURCE1   +   vcode   +   SVG_SOURCE2);  
            }  
   
            private   void   outJPEG(String   vcode,   HttpServletResponse   resp)   throws   IOException    
            {  
                    resp.setContentType("image/jpeg");  
                    BufferedImage   image   =   new   BufferedImage(IMAGE_WIDTH,   IMAGE_HEIGHT,  
                              BufferedImage.TYPE_INT_RGB);  
                    Random   random   =   new   Random();  
                    Graphics   g   =   image.getGraphics();  
                    //g.setColor(getRandColor(200,   250));  
                    g.fillRect(0,   0,   IMAGE_WIDTH,   IMAGE_HEIGHT);  
                    g.setFont(new   Font("Times   New   Roman",   Font.PLAIN,   18));  
                    //g.setColor(getRandColor(160,   200));  
                    for   (int   i   =   0;   i   <   155;   i++)    
                    {  
                              int   x   =   random.nextInt(IMAGE_WIDTH);  
                              int   y   =   random.nextInt(IMAGE_HEIGHT);  
                              int   xl   =   random.nextInt(12);  
                              int   yl   =   random.nextInt(12);  
                              g.drawLine(x,   y,   x   +   xl,   y   +   yl);  
                    }  
                    for   (int   i   =   1;   i   <=   4;   i++)    
                    {  
                              String   rand   =   vcode.substring(i   -   1,   i);  
                              g.setColor(new   Color(20   +   random.nextInt(110),   20   +   random.nextInt(110),   20   +   random.nextInt(110)));  
                              g.drawString(rand,   13   *   (i   -   1)   +   0,   16);  
                    }  
                    ImageWriter   writer   =   (ImageWriter)   ImageIO.getImageWritersByFormatName("jpeg").next();  
                    JPEGImageWriteParam   params   =   new   JPEGImageWriteParam(null);  
                    ImageOutputStream   ios   =   ImageIO.createImageOutputStream(resp.getOutputStream());  
                    writer.setOutput(ios);  
                    writer.write(null,   new   IIOImage(image,   null,   null),   params);  
                    writer.dispose();  
                    ios.close();  
            }  
   
            static   String   sn2vcode()    
            {  
                    String   sRand   =   "";  
                    Random   random   =   new   Random();  
                    for   (int   i=0;i<4;i++)  
                    {  
                              String   rand=String.valueOf(random.nextInt(10));  
                              sRand+=rand;  
                    }  
                    return   sRand;  
            }  
   
   
            public   void   init()   throws   ServletException    
            {  
                    try    
                    {  
                              GraphicsEnvironment.getLocalGraphicsEnvironment();  
                    }    
                  catch   (Throwable   e)    
                    {  
                 
                              svgMode   =   true;  
                    }  
            }  
   
   
            public   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);  
            }  
  }  
   
  Top

6 楼funcreal(为中华之崛起而编程)回复于 2005-12-22 12:53:39 得分 5

在页面中直接写:  
  <body   bgcolor="#ffffff">  
  <h1>  
  <%  
  response.getOutputStream();  
  %>  
  </h1>  
  </body>  
  就会出错,应该输出流只能被打开一次,而生成servlet以后,在你的语句之前已经被打开过了。  
  因为servlet要输出html标签。  
   
   
  这是jdk中的说明:  
  java.lang.IllegalStateException   -   if   the   getWriter   method   has   been   called   on   this   response  
  getWriter   method,看清楚,不一定是getOutputStreamTop

7 楼octopus2027(章鱼)回复于 2005-12-22 13:01:49 得分 5

JSP默认的输出流为PrintWriter   ,即<%   %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除<%%>中的任何东西(包括HTML标签,空格,回车等东西)应该就可以.  
   
  粗浅看法,不知道对错:PTop

8 楼uupo(石翮)回复于 2006-02-22 16:03:31 得分 0

支持啊,支持!!Top

相关问题

  • 高分求解:java.lang.IllegalStateException: getOutputStream() has already been called for this response
  • 奇怪的问题!!!getOutputStream() has already been called for this response!!!!
  • 程序出现java.lang.IllegalStateException: getOutputStream() has already been called for this response,请问如何解决?
  • 身份验证
  • 验证问题
  • 密码验证
  • 验证程序?
  • struts 验证
  • 验证码
  • dynaValidatorForm验证

关键词

  • source
  • servlet
  • vcode
  • imageio
  • getoutputstream
  • resp
  • svg
  • bufferedimage
  • fc
  • random

得分解答快速导航

  • 帖主:sunnysnow
  • binny
  • CalvinKyle
  • octopus2027
  • jiahang8195
  • funcreal
  • octopus2027

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo