转:随机生成动态验证码 http://www.blogjava.net/JAVA-HE/archive/2007/05/29/120582.aspx

 

为了防止某些用户使用软件进行登录和发布信息,很多网站在用户登录或者发布信息时,都要求用户输入验证码。验证码通常是以一幅图片的形式显示的,用户按照图片中显示的数字或者字母依次输入,服务端将对用户输入和验证码进行比较,以判断用户是否经过检验。由于验证码都是随机生成的,自动发布信息的软件无法知道生成的验证码。

 

  1 生成图片的程序:
  2 /*
  3 * RandomCodeServlet.java
  4 *
  5 * Created on 2007-5-29, 0:51:02
  6 *
  7 * To change this template, choose Tools | Template Manager
  8 * and open the template in the editor.
  9 */

 10
 11 package  com.javahe.image;
 12
 13 /**
 14 *
 15 * @author java-he
 16 */

 17 import  java.awt.Color;
 18 import  java.awt.Font;
 19 import  java.awt.Graphics2D;
 20 import  java.awt.image.BufferedImage;
 21 import  java.util.Random;
 22 import  javax.imageio.ImageIO;
 23
 24 import  javax.servlet. * ;
 25 import  java.io. * ;
 26 import  javax.servlet.http. * ;
 27
 28 public   class  RandomCodeServlet  extends  HttpServlet  {
 29    //验证码图片的宽度。
 30    private int width=60;
 31    //验证码图片的高度。
 32    private int height=20;
 33    
 34    protected void service(HttpServletRequest req, HttpServletResponse resp)
 35            throws ServletException, java.io.IOException {
 36        BufferedImage buffImg=new BufferedImage(width,height,
 37                BufferedImage.TYPE_INT_RGB);
 38        Graphics2D g=buffImg.createGraphics();
 39        
 40        //创建一个随机数生成器类。
 41        Random random=new Random();
 42        
 43        g.setColor(Color.WHITE);
 44        g.fillRect(0,0,width,height);
 45        
 46        //创建字体,字体的大小应该根据图片的高度来定。
 47        Font font=new Font("Times New Roman",Font.PLAIN,18);
 48        //设置字体。
 49        g.setFont(font);
 50        
 51        //画边框。
 52        g.setColor(Color.BLACK);
 53        g.drawRect(0,0,width-1,height-1);
 54        
 55        //随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
 56        g.setColor(Color.GRAY);
 57        for (int i=0;i<160;i++{
 58            int x = random.nextInt(width);
 59            int y = random.nextInt(height);
 60            int xl = random.nextInt(12);
 61            int yl = random.nextInt(12);
 62            g.drawLine(x,y,x+xl,y+yl);
 63        }

 64        
 65        
 66        //randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
 67        StringBuffer randomCode=new StringBuffer();
 68        int red=0,green=0,blue=0;
 69        
 70        //随机产生4位数字的验证码。
 71        for (int i=0;i<4;i++{
 72            //得到随机产生的验证码数字。
 73            String strRand=String.valueOf(random.nextInt(10));
 74            
 75            //产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
 76            red=random.nextInt(110);
 77            green=random.nextInt(50);
 78            blue=random.nextInt(50);
 79            
 80            //用随机产生的颜色将验证码绘制到图像中。
 81            g.setColor(new Color(red,green,blue));
 82            g.drawString(strRand,13*i+6,16);
 83            
 84            //将产生的四个随机数组合在一起。
 85            randomCode.append(strRand);
 86        }

 87        //将四位数字的验证码保存到Session中。
 88        HttpSession session=req.getSession();
 89        session.setAttribute("randomCode",randomCode.toString());
 90        
 91        //禁止图像缓存。
 92        resp.setHeader("Pragma","no-cache");
 93        resp.setHeader("Cache-Control","no-cache");
 94        resp.setDateHeader("Expires"0);
 95        
 96        resp.setContentType("image/jpeg");
 97        
 98        //将图像输出到Servlet输出流中。
 99        ServletOutputStream sos=resp.getOutputStream();
100        ImageIO.write(buffImg, "jpeg",sos);
101        sos.close();
102    }

103}

104
105


 1 写好后在web.xml中添加对应的servlet。然后页面调用的时候用。
 2 <% @page contentType="text/html" %>
 3 <% @page pageEncoding="UTF-8" %>
 4 <% --
 5The taglib directive below imports the JSTL library. If you uncomment it,
 6you must also add the JSTL library to the project. The Add Library action
 7on Libraries node in Projects view can be used to add the JSTL 1.1 library.
 8--
%>
 9 <% --
10<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%>  
11 --%>
12 <%
13if(request.getParameter("random")!=null)
14{
15    if(request.getParameter("random").equals(session.getAttribute("randomCode")))
16    {
17        out.println("ok!");
18    }
19}
20
%>
21 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
22 "http://www.w3.org/TR/html4/loose.dtd" >
23
24 < html >
25      < head >< title > 登录页面 </ title >
26      < body >
27          < form  method ="POST"  action ="index.jsp" >
28              < table >
29                  < tr >
30                      < td > 用户名: </ td >
31                      < td >< input  type ="text"  name ="username" ></ td >
32                  </ tr >
33                  < tr >
34                      < td > 密码: </ td >
35                      < td >< input  type ="password"  name ="password" ></ td >
36                  </ tr >
37                  < tr >
38                      < td > 验证码: </ td >
39                      < td >
40                          < input  type ="text"  name ="random"  maxlength ="4" >
41                      < img  src ="imgcode" >
42                      </ td >
43                  </ tr >
44                  < tr >
45                      < td >< input  type ="reset"  value ="重填" ></ td >
46                      < td >< input  type ="submit"  value ="提交" ></ td >
47                  </ tr >
48              </ table >
49          </ form >
50      </ body >
51 </ html >
52
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值