论坛首页 Java企业应用论坛

验证码生成之JavaServlet-Edition

浏览 3642 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-27  

概述:验证码对于各大论坛的信息验证功能来说已经成了不可或缺的一部分,至于其作用,本人就不在这里赘述。近日,本人在自己也实现了一个JavaServlet版的验证码,现把其源代码贴出来,请各位不吝赐教。

实现机理:生成一串随机数,其中可以是固定值,可以是可变值,本人的随机数长度固定为4(可根据您自己的程序进行改变),等到随机字符串产生后,将此字符串打乱成字符,然后一个一个的把字符画到输出流里,其中每个字符的颜色即RGB值也是随机产生,在画面的同时,再产生若干条干扰线,以防止验证码被破解。然后把图象流输出到客户端。其中客户端的HTML代码利用img标签实现。

Servlet源代码:

java 代码
  1. public void doGet(HttpServletRequest request, HttpServletResponse response)   
  2.             throws ServletException, IOException {   
  3.         //设置响应格式   
  4.         response.setContentType("image/jpeg");   
  5.         //定义一个BufferedImage对象 其构造函数属性参照API   
  6.         BufferedImage image = new BufferedImage(80,20,BufferedImage.SCALE_SMOOTH);   
  7.         //根据上述对象产生一个Graphics2D上下文   
  8.         Graphics2D graphics = image.createGraphics();   
  9.         //将上下文颜色设置为白色   
  10.         graphics.setColor(Color.WHITE);   
  11.         graphics.fillRect(00,100,20);   
  12.         //设置书写字体   
  13.         graphics.setFont(new Font("Roman",Font.CENTER_BASELINE,22));   
  14.         //randomString方法见后面,负责产生由4个字符组成的字符串   
  15.         String randomStr=randomString(4);   
  16.         for(int i=0;i
  17.         //随机设置上下文颜色   
  18.         graphics.setColor(new Color(new Random().nextInt(250),new Random().nextInt(250),   
  19.                     new Random().nextInt(250)));   
  20.         //按字符把其画出来   
  21.         graphics.drawString(randomStr.substring(i,i+1),15*i,20);   
  22.         //产生干扰线   
  23.         graphics.drawLine(0,0,11);   
  24.         }   
  25.         //禁止缓冲代码,没有这段的话则不能进行更新显示,删除效果请自行测试   
  26.         response.setHeader("Prama""no-cache");   
  27.         response.setHeader("Coche-Control""no-cache");   
  28.         response.setDateHeader("Expires"0);      
  29.         //写入到客户端    
  30.         ImageIO.write(image,"jpeg",response.getOutputStream());   
  31.     }  

 

randomString方法源代码:

java 代码

     //number 产生有number个字符组成的字符串
  1. public String randomString(int number){ 
  2.     //字符串的内容组成  
  3.     String str="1234567890qwertyuioplkjhgfdsazxcvbnm";   
  4.     char[] chars=str.toCharArray();   
  5.     int length=chars.length;   
  6.     StringBuilder sb=new StringBuilder();   
  7.     Random random=new Random();   
  8.     //随机生成number个字符   
  9.     for(int i=0;i
  10.         //把单个字符转换成字符串然后追加到已经产生的字符串中
  11.         sb.append(new String(new Character(chars[random.nextInt(length)]).toString()));   
  12.     }   
  13.     return sb.toString();   
  14. }  
Jsp文件源代码:

jsp 代码
  1.       
  2.   <!---->    
  3.   <img src="<!---->/random"  id="PHOTO"       
  4.   onclick="document.getElementById('PHOTO').src='<!---->/random';return false;"/>      
  5.   <a href="<!---->/switch.do?prefix=/demo&page=/show.jsp">qqqa>      
  6.   <br>      
  7.   <input type="button" onclick="javascript:document.getElementById('photo').src='<!---->/random';return false;"     
  8.     value="看不清楚?">      
   发表时间:2007-09-28  
吹毛求疵的一点:验证码怎么没有保存下来?
0 请登录后投票
   发表时间:2007-09-28  
for循环的条件不完整
不知道是不是javaeye程序的问题
0 请登录后投票
   发表时间:2007-09-28  
更正:randomString方法的完整for循环。
for(int i=0;i<number;i++){
sb.append(new String(new Character(chars[random.nextInt(length)]).toString()));
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics