验证码

来源:互联网 发布:金山软件怎么样 编辑:程序博客网 时间:2024/06/08 23:59

Jsp页面:

<script type="text/javascript" src="js/jquery.js"></script>

<script type="text/javascript">

       function changeImg(){  

        var imgSrc = $("#imgObj");  

        var src = imgSrc.attr("src");  

        imgSrc.attr("src",chgUrl(src));  

       }  

       //时间戳  

       //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳  

       function chgUrl(url){  

        var timestamp = (new Date()).valueOf();  

        url = url.substring(0,17);  

        if((url.indexOf("&")>=0)){  

             url = url + "¡Átamp=" + timestamp;  

        }else{  

             url = url + "?timestamp=" + timestamp;  

        }  

        return url;  

       }  

 

       function isRightCode(){  

        var code = $("#veryCode").val();

        code = code;  

        $.ajax({  

             type:"POST",  

             url:"resultServlet",  

             data:"veryCode=" + code,  

             success:callback  

           });  

       }  

 

       function callback(data){  

        $("#info").html(data);  

       } 

<!—- 仅刷新验证码不刷新页面 -->

        function changeVerifyCode(){ 

 

    var img = document.getElementById('imgObj'); //在拿到id=imgVcode的<img/>对象 

 

    var time = new Date().getTime();//拿到当前时间 

 

    img.src = img.src +'?' + time;//拼接img中src的地址 

 

  } 

    </script>

<input id="veryCode" name="veryCode" type="text"/> 

        <img id="imgObj" alt="" src="verifyCodeServlet"/> 

        <a href="javascript:changeVerifyCode()">换一张</a> 

        <input type="button" value="验证" onclick="isRightCode()"/> 

        <div id="info"></div>

Web.xml中配置:

<!-- 验证码 -->

   <servlet>

     <servlet-name>VerifyCodeServlet</servlet-name>

     <servlet-class>com.sample.action.VerifyCodeServlet</servlet-class>

    </servlet>

    <servlet>

     <servlet-name>ResultServlet</servlet-name>

     <servlet-class>com.sample.action.ResultServlet</servlet-class>

     <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

     <servlet-name>VerifyCodeServlet</servlet-name>

     <url-pattern>/verifyCodeServlet</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

     <servlet-name>ResultServlet</servlet-name>

     <url-pattern>/resultServlet</url-pattern>

    </servlet-mapping>

ResultServlet中:

package com.sample.action;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class ResultServlet extends HttpServlet{

     /** 

     * The doGet method of the servlet. <br> 

     * 

     * This method is called when a form has its tag value method equals to get. 

     *  

     * @param request the request send by the client to the server 

     * @param response the response send by the server to the client 

     * @throws ServletException if an error occurred 

     * @throws IOException if an error occurred 

     */ 

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

 

        doPost(request, response);  

    }  

 

    /** 

     * The doPost method of the servlet. <br> 

     * 

     * This method is called when a form has its tag value method equals to post. 

     *  

     * @param request the request send by the client to the server 

     * @param response the response send by the server to the client 

     * @throws ServletException if an error occurred 

     * @throws IOException if an error occurred 

     */ 

    public void doPost(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

 

        response.setContentType("text/html;charset=utf-8");  

        String validateC = (String) request.getSession().getAttribute("validateCode");  

        String veryCode = request.getParameter("veryCode");

        PrintWriter out = response.getWriter();  

        if(veryCode==null||"".equals(veryCode)){  

            out.println("验证码为空");  

        }else{  

            if(validateC.equals(veryCode)){  

                out.println("验证码正确");  

            }else{  

                out.println("验证码错误");  

            }  

        }  

        out.flush();  

        out.close();  

    }  

 

}

VerifyCodeServlet中:

第一种:产生干扰线

package com.sample.action;

 

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;

 

public class VerifyCodeServletextends HttpServlet{

     /**  */

    private static final long serialVersionUID = 1L;

 

    /**

        * 验证码图片的宽度。

        */

        private int width = 60;  

       

        /**

        *  验证码图片的高度。

        */

        private int height = 20;  

     

     

        /**

        * 验证码字符个数

        */

        private int codeCount = 4;  

     

        /**

        * xx

        */

        private int xx = 0;  

     

        /**

        * 字体高度  

        */

        private int fontHeight;  

     

        /**

        * codeY

        */

        private int codeY;  

     

        /**

        * codeSequence

        */

        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',

                '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' };  

     

        /** 

         * 初始化验证图片属性 

         */ 

        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) {

             e.printStackTrace();

            }  

     

            xx = width / (codeCount + 1);  

            fontHeight = height - 2;  

            codeY = height - 4;  

     

        }  

     

        /**

        * @param req

        * @param resp

        * @throws ServletException

        * @throws java.io.IOException

        */

        protected void service(HttpServletRequest req, HttpServletResponse resp)  

                throws ServletException, java.io.IOException {  

     

            // 定义图像buffer  

            BufferedImage buffImg = new BufferedImage(width, height,  

                    BufferedImage.TYPE_INT_RGB);  

            Graphics2D gd = buffImg.createGraphics();  

     

            // 创建一个随机数生成器类  

            Random random = new Random();  

     

            // 将图像填充为白色  

            gd.setColor(Color.WHITE);  

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

     

            // 创建字体,字体的大小应该根据图片的高度来定。  

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

            // 设置字体。  

            gd.setFont(font);  

     

            // 画边框。  

            gd.setColor(Color.BLACK);  

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

     

            // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。  

            gd.setColor(Color.BLACK);  

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

                int x = random.nextInt(width);  

                int y = random.nextInt(height);  

                int xl = random.nextInt(12);  

                int yl = random.nextInt(12);  

                gd.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(62)]); 

                // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。  

                red = random.nextInt(255);  

                green = random.nextInt(255);  

                blue = random.nextInt(255);  

     

                // 用随机产生的颜色将验证码绘制到图像中。  

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

                gd.drawString(strRand, (i + 1) * xx, 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();  

        }  

     

    }

第二种产生画布和噪点

package com.sample.action;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

 

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

 

public class CommonVerifyAction extends HttpServlet{

    private static final long serialVersionUID = 4999526670134381955L;

    protected static Random random=new Random();

     

        /**

        * @param req

        * @param resp

        * @throws ServletException

        * @throws java.io.IOException

        */

        protected void service(HttpServletRequest req, HttpServletResponse resp)  

                throws ServletException, java.io.IOException {  

     

         // TODO Auto-generated method stub

            req.setCharacterEncoding("utf-8");

            resp.setCharacterEncoding("utf-8");

            resp.setContentType("image/jpeg"); //设置输出类型为jpeg图片

            int width=70;

            int height=30;                     //验证图片的宽度,高度

            Color back=getBack();

            Color front=getFront(back);

            String code=getString();

            req.getSession().setAttribute("validateCode", code);  //保存到session里面

            BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);

            Graphics2D g=bi.createGraphics();   //得到画布

            g.setFont(new Font("楷体",Font.BOLD,20));  //设置字体

            g.setColor(back);

            g.fillRect(0, 0, width, height);    //画背景

            g.setColor(front);

            g.drawString(code,18,20);           //画字符

            for(int i=0,n=random.nextInt(20);i<n;i++){

                g.fillRect(random.nextInt(width),random.nextInt(height),1,1);

                 

            }                                   //产生至多20个噪点

            ServletOutputStream so=resp.getOutputStream();  //得到二进制输出流 

            JPEGImageEncoder je=JPEGCodec.createJPEGEncoder(so); //对图片进行编码成jpeg格式

            je.encode(bi);                    

            so.flush();                         //刷新缓存

             

             

        }

        /**

         * @desc 得到图片背景色

         * @author aj

         * @date 2011-3-30

         * */

        protected static Color getBack(){

            return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));

        }

        /**

         * @desc 生成颜色的反色

         * @author aj

         * @date 2011-3-30

         * */

        protected static Color getFront(Color c){

            return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());

             

        }

        /**

         * @desc 产生随机字符

         * @author aj

         * @date 2011-3-30

         * */

        protected static String getString(){

            String old="23456789abcdefghijklmnopqrstuvwxyz"; //验证图片上面的随机字符

            StringBuffer sb=new StringBuffer();

            int j=0;

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

                j=random.nextInt(old.length());

                sb.append(old.substring(j,j+1));

            }

             

           return sb.toString();    

        }

     

    }

 

 

 

 

 

原创粉丝点击