為了防止某些用戶使用軟件進行登錄和發布信息,很多網站在用戶登錄或者發布信息時,都要求用戶輸入驗證碼。驗證碼通常是以一幅圖片的形式顯示的,用戶按照圖片中顯示的數字或者字母依次輸入,服務端將對用戶輸入和驗證碼進行比較,以判斷用戶是否經過檢驗。由于驗證碼都是隨機生成的,自動發布信息的軟件無法知道生成的驗證碼。

           

            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
           11package com.javahe.image;
           12
           13/**
           14 *
           15 * @author java-he
           16 */

           17import java.awt.Color;
           18import java.awt.Font;
           19import java.awt.Graphics2D;
           20import java.awt.image.BufferedImage;
           21import java.util.Random;
           22import javax.imageio.ImageIO;
           23
           24import javax.servlet.*;
           25import java.io.*;
           26import javax.servlet.http.*;
           27
           28public 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

           

          最近用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 運行,或者編譯都顯得很慢。呵呵,也許是我電腦內存只有 512M 的原因吧。

          posted on 2007-05-29 02:13 -274°C 閱讀(4444) 評論(3)  編輯  收藏 所屬分類: JSP計算機綜合


          FeedBack:
          # re: 隨機生成動態驗證碼
          2007-05-29 08:36 | Swing
          另外一個提倡的方法是生成隨機數以后 把相應的圖片畫出來
          這樣可以根據需要調用隨機數的風格  回復  更多評論
            
          # re: 隨機生成動態驗證碼
          2008-01-30 22:38 | java綜合網
          http://www.javazh.cn
          java綜合網
          不錯,不錯哦  回復  更多評論
            
          # re: 隨機生成動態驗證碼
          2014-05-01 20:56 | 廈華
          fdfdfdf  回復  更多評論
            

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網站

          關注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 916110
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 阜阳市| 广西| 镇远县| 定陶县| 错那县| 榕江县| 行唐县| 洛川县| 文安县| 缙云县| 视频| 平昌县| 天柱县| 吐鲁番市| 宁阳县| 南丹县| 台中市| 射阳县| 邵武市| 襄樊市| 栾川县| 浏阳市| 布拖县| 崇左市| 汉川市| 讷河市| 镇江市| 瑞丽市| 罗江县| 临清市| 临猗县| 得荣县| 蚌埠市| 丰原市| 长沙市| 旺苍县| 贵德县| 乌拉特前旗| 青海省| 天全县| 九龙城区|