jQuery实现验证码的后后验证


 

在进行验证证码验证的时候,我们很多时候都在进行表单的填写,这时候我们都不希望页面刷新这样的事情出现,从服务器资源的角度来说,每刷新一次页面就要全部输出一次页面内容,然而许多内容其实都没有发生变化根本就没有必要重新发送一次,这就造成了流量浪费。验证证码的验证其实可以在后台进行,使用ajax完全可以做到无刷新在后台检验验证码。下面就是用jQuery实现的验证码后台验证。

 

VerifyCodeServlet.java

 

 

Java代码复制代码

 

   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 VerifyCodeServlet extends HttpServlet {  

     

       // 验证码图片的宽度。  

       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, HttpServletResponseresp)  

                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();  

       }  

     

   } 

 

[java] view plaincopy

 

   import java.awt.Color; 

    importjava.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 VerifyCodeServlet extends HttpServlet { 

     

       // 验证码图片的宽度。 

       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, HttpServletResponseresp) 

                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(); 

       } 

     

   } 

 

 

 

 

 

ResultServlet.java

 

 

Java代码复制代码

 

   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 toget. 

        *  

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

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

        * @throws ServletException if an error occurred 

        * @throws IOException if an error occurred 

        */ 

       public void doGet(HttpServletRequest request, HttpServletResponseresponse)  

                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 topost. 

        *  

        * @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, HttpServletResponseresponse)  

                throws ServletException,IOException {  

     

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

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

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

           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();  

       }  

     

   } 

 

[java] view plaincopy

 

   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 toget.

        * 

        * @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, HttpServletResponseresponse) 

                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 topost.

        * 

        * @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, HttpServletResponseresponse) 

                throws ServletException,IOException { 

     

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

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

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

           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(); 

       } 

     

   } 

 

 

 

 

 

verifyCode.js

 

 

Js代码复制代码

 

   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").attr("value");  

       code = "c=" + code;  

       $.ajax({  

           type:"POST",  

           url:"resultServlet",  

           data:code,  

           success:callback  

       });  

   }  

     

   function callback(data){  

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

   } 

 

[js] view plaincopy

 

   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").attr("value"); 

       code = "c=" + code; 

       $.ajax({ 

           type:"POST", 

           url:"resultServlet", 

           data:code, 

           success:callback 

       }); 

   } 

     

   function callback(data){ 

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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值