Jsp验证码的制作

来源:互联网 发布:js下载文件进度条 编辑:程序博客网 时间:2024/05/16 00:52
JSP验证码制作参考地址1:http://qify.iteye.com/blog/747842
JSP验证码制作参考地址2:http://blog.163.com/xiexueyong1987@126/blog/static/1262673422009817034728/


getOutputStream() has already been called for thisresponse异常出现的原因和解决方法:
具体的原因:jsp编译成servlet之后在函数

_jspService(HttpServletRequest request, HttpServletResponseresponse)

 

的最后
有一段这样的代码

Java代码  
  1. finally  
  2.       if (_jspxFactory != null  
  3.           _jspxFactory.releasePageContext(_jspx_page_context);  
  4.  

 

这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。然后当然是要提出解决的办法,其实挺简单的,在使用完输出流以后调用以下两行代码即可:

Java代码  
  1. out.clear();  
  2. out pageContext.pushBody(); 

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

对此我的理解是清除掉输出流的内容,然后推入当前jsp内容返回out,这样做的目的重生一个out可供使用,虽然理解的不够,我觉得大致如此吧!

JSP验证码制作参考地址2中我使用了后台方式,就是下面的代码,注意红色的字部分,原文在使用过程中,

原文并没有进行流关闭的操作,经过相应流关闭操作之后,导致getOutputStream() hasalready been called for thisresponse错误,对此我进行了os流关闭动作,此错误没有再发生

假如再发生,请尝试在Jsp页面调用完后台方法之后,再加上

产生

package vl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MakeCertPic {
    //验证码图片中可以出现的字符集,可以根据需要修改
    private char mapTable[]={
      'a','b','c','d','e','f',
      'g','h','i','j','k','l',
      'm','n','o','p','q','r',
      's','t','u','v','w','x',
      'y','z','0','1','2','3',
      '4','5','6','7','8','9'
    };
   
    public String getCertPic(int width,intheight,OutputStream os){
     if(width<=0)
      width=60;
     if(height<=0)
      height=20;
     BufferedImage image= newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
     //获取图形上下文
     Graphics g = image.getGraphics();
     //设定背景颜色
     g.setColor(new Color(0xDCDCDC));
     g.fillRect(0,0,width,height);
     //画边框
     g.setColor(Color.black);
     g.drawRect(0,0,width-1,height-1);
     //随机产生的验证码
     String strEnsure = "";
     //4代表4为验证码,如果要产生更多位的验证码,则加大数值
     for(int i = 0;i<4;++i){
      strEnsure += mapTable[(int)(mapTable.length*Math.random())];
     }
     //将认证码显示到图像中,如果要生成更多位的验证码,增加drawString语句
     g.setColor(Color.black);
     g.setFont(new Font("AtlanticInline",Font.PLAIN,18));
     String str = strEnsure.substring(0,1);
     g.drawString(str,8,17);
     str = strEnsure.substring(1,2);
     g.drawString(str, 20, 15);
     str = strEnsure.substring(2,3);
     g.drawString(str, 35, 18);
     str = strEnsure.substring(3,4);
     g.drawString(str, 45, 15);
     //随机产生15个干扰点
     Random rand = new Random();
     for(int i=0; i<10; i++){
      int x =rand.nextInt(width);
      int y =rand.nextInt(height);
      g.drawOval(x,y,1,1);
     }
     //释放图形上下文
     g.dispose();
     try{
      //输出图形到页面
      ImageIO.write(image, "JPEG",os);
    //注意看以下几句的使用 
      os.flush(); 
     os.close(); 
      os=null;

     }catch (IOException e){
      return "";
     }
     return strEnsure;
    }
}
页面1代码:


原创粉丝点击