随机生成动态验证码

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

 

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

 10 None.gif
 11 None.gif package  com.javahe.image;
 12 None.gif
 13 ExpandedBlockStart.gifContractedBlock.gif /** */ /**
 14InBlock.gif *
 15InBlock.gif * @author java-he
 16ExpandedBlockEnd.gif */

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

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

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

103ExpandedBlockEnd.gif}

104 None.gif
105 None.gif


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

 

最近用netbeans 总容易发生一个运行错误,指向

<nbdeploy debugmode="false" clientUrlPart="${client.urlPart}" forceRedeploy="${forceRedeploy}"/>

。感觉是绑定tomcat失败。今天晚上调式这个程序的时候又遇到这个问题。发现重启电脑后,就正常了。也许是先前运行了其他tomcat下的程序吧。

 

sun的网站看看

http://forum.java.sun.com/thread.jspa?threadID=610420&messageID=4240787

发现不少人遇到同样问题,但是具体似乎没有说出个所以然,我也不想深究,必定问题自己能解决就行。呵呵。看来netbeans M9还是不够好哦。期待beta版本。

 

感觉M9 运行,或者编译都显得很慢。呵呵,也许是我电脑内存只有 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="512" unitname="m">512M</chmetcnv>的原因吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值