中文JAVA技術平等自由協作創造

          Java專題文章博客和開源

          常用鏈接

          統計

          最新評論

          Java實現隨機驗證碼功能實例

            現在許多系統的注冊、登錄或者發布信息模塊都添加的隨機碼功能,就是為了避免自動注冊程序或者自動發布程序的使用雅思答案

            驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上,如果進行提交操作的同時需要將圖片上的字符同時提交,如果提交的字符與服務器session保存的不同,則認為提交信息無效。為了避免自動程序分析解析圖片,通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲,增加自動識別的難度。

            在這里,我們使用servlet來實現隨機驗證碼的實現。

            package com.servlet;

            import java.awt.Color;

            import java.awt.Font;

            import java.awt.Graphics2D;

            import java.awt.image.BufferedImage;

            import java.util.Random;

            import javax.imageio.ImageIO;

            import javax.servlet.ServletException;

            import javax.servlet.ServletOutputStream;

            import javax.servlet.http.HttpServlet;

            import javax.servlet.http.HttpServletRequest;

            import javax.servlet.http.HttpServletResponse;

            import javax.servlet.http.HttpSession;

            /**

            * 生成隨機驗證碼

            * @author bitiliu

            *

            */

            public class ValidateCodeServlet extends HttpServlet

            {

            private static final long serialVersionUID = 1L;

            //驗證碼圖片的寬度。

            private int width=60;

            //驗證碼圖片的高度。

            private int height=20;

            //驗證碼字符個數

            private int codeCount=4;

            private int x=0;

            //字體高度

            private int fontHeight;

            private int codeY;

            char[] codeSequence = { '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 void init() throws ServletException

            {

            //從web.xml中獲取初始信息

            //寬度

            String strWidth=this.getInitParameter("width");

            //高度

            String strHeight=this.getInitParameter("height");

            //字符個數

            String strCodeCount=this.getInitParameter("codeCount");

            //將配置的信息轉換成數值

            try

            {

            if(strWidth!=null && strWidth.length()!=0)

            {

            width=Integer.parseInt(strWidth);

            }

            if(strHeight!=null && strHeight.length()!=0)

            {

            height=Integer.parseInt(strHeight);

            }

            if(strCodeCount!=null && strCodeCount.length()!=0)

            {

            codeCount=Integer.parseInt(strCodeCount);

            }

            }

            catch(NumberFormatException e)

            {}

            x=width/(codeCount+1);

            fontHeight=height-2;

            codeY=height-4;

            }

            protected void service(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, java.io.IOException {

            //定義圖像buffer

            BufferedImage buffImg = new BufferedImage(

            width, height,BufferedImage.TYPE_INT_RGB);

            Graphics2D g = buffImg.createGraphics();

            //創建一個隨機數生成器類

            Random random = new Random();

            //將圖像填充為白色

            g.setColor(Color.WHITE);

            g.fillRect(0, 0, width, height);

            //創建字體,字體的大小應該根據圖片的高度來定。

            Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);

            //設置字體。

            g.setFont(font);

            //畫邊框。

            g.setColor(Color.BLACK);

            g.drawRect(0, 0, width - 1, height - 1);

            //隨機產生160條干擾線,使圖象中的認證碼不易被其它程序探測到。

            g.setColor(Color.BLACK);

            for(int i = 0; i < 160; i++)

            {

            int x = random.nextInt(width);

            int y = random.nextInt(height);

            int xl = random.nextInt(12);

            int yl = random.nextInt(12);

            g.drawLine(x, y, x + xl, y + yl);

            }

            //randomCode用于保存隨機產生的驗證碼,以便用戶登錄后進行驗證。

            StringBuffer randomCode = new StringBuffer();

            int red = 0, green = 0, blue = 0;

            //隨機產生codeCount數字的驗證碼。

            for (int i = 0; i < codeCount; i++) {

            //得到隨機產生的驗證碼數字。

            String strRand = String.valueOf(codeSequence[random.nextInt(36)]);

            //產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同。

            red = random.nextInt(255);

            green = random.nextInt(255);

            blue = random.nextInt(255);

            //用隨機產生的顏色將驗證碼繪制到圖像中。

            g.setColor(new Color(red, green, blue));

            g.drawString(strRand, (i + 1) * x, codeY);

            //將產生的四個隨機數組合在一起。

            randomCode.append(strRand);

            }

            // 將四位數字的驗證碼保存到Session中。

            HttpSession session = req.getSession();

            session.setAttribute("validateCode", randomCode.toString());

            // 禁止圖像緩存。

            resp.setHeader("Pragma", "no-cache");

            resp.setHeader("Cache-Control", "no-cache");

            resp.setDateHeader("Expires", 0);

            resp.setContentType("image/jpeg");

            //將圖像輸出到Servlet輸出流中。

            ServletOutputStream sos = resp.getOutputStream();

            ImageIO.write(buffImg, "jpeg", sos);

            sos.close();

            }

            }

            需要在web.xml中聲明servlet

            ValidateCodeServlet

            com.servlet.ValidateCodeServlet

            width

            200

            height

            80

            codeCount

            5

            ValidateCodeServlet

            /validateCodeServlet

            用戶提交后就可以將用戶輸入的驗證碼與session中保存的字符串進行比對,達到驗證的效果雅思改分

          posted on 2013-06-09 22:51 好不容易 閱讀(195) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 麦盖提县| 彭阳县| 托克托县| 娄烦县| 哈尔滨市| 安乡县| 乌拉特后旗| 临海市| 威宁| 固始县| 安平县| 日照市| 肃南| 武义县| 天全县| 紫阳县| 鲜城| 榕江县| 沽源县| 民权县| 北海市| 邵东县| 乐陵市| 凤阳县| 扎兰屯市| 和顺县| 徐水县| 九龙城区| 青铜峡市| 十堰市| 来安县| 南皮县| 方城县| 辽阳市| 怀化市| 勃利县| 昭觉县| 精河县| 富锦市| 望城县| 韶山市|