jquery实现无刷新验证码的简单实例


Posted in Javascript onMay 19, 2016

1. 思路:

页面上的验证码图片是servlet,采用jquery实现异步校验信息

2. 所用到的文件

VerifyCodeServlet.java   --用于生成图片的servlet

ResultServlet.java          --用于校验验证码正确性的servlet

verifyCode.js                  --校验的js文件

jquery.js                         --jquery包里的源文件

verifyCode.jsp                --页面

3. 代码

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

}

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

verifyCode.jsp

Html代码

<%@ page language="java" contentType="text/html; charset=UTF-8"  
  pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
  <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <script type="text/javascript" src="js/verifyCode.js"></script>  
    <script type="text/javascript" src="js/jquery.js"></script>  
    <title>test verify code</title>  
  </head>  
  <body>  
    <input id="veryCode" name="veryCode" type="text"/>  
    <img id="imgObj" alt="" src="verifyCodeServlet"/>  
    <a href="#" onclick="changeImg()">换一张</a>  
    <input type="button" value="验证" onclick="isRightCode()"/>  
    <div id="info"></div>  
  </body>  
</html>

以上这篇jquery实现无刷新验证码的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery选择器 $实现原理
Dec 02 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
Sep 14 Javascript
jQuery Migrate 1.1.0 Released 注意事项
Jun 14 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
快速学习JavaScript的6个思维技巧
Oct 13 Javascript
AngularJS中的API(接口)简单实现
Jul 28 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
jquery radio 动态控制选中失效问题的解决方法
Feb 28 jQuery
vue中使用极验验证码的方法(附demo)
Dec 04 Javascript
js实现简单音乐播放器
Jun 30 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 #Javascript
JavaScript:Array类型全面解析
May 19 #Javascript
JavaScript:Date类型全面解析
May 19 #Javascript
javascript中对Date类型的常用操作小结
May 19 #Javascript
JS Attribute属性操作详解
May 19 #Javascript
jQuery点击输入框显示验证码图片
May 19 #Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
May 18 #Javascript
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
PHP中each与list用法分析
2016/01/08 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
python中子类调用父类函数的方法示例
2017/08/18 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
python读取各种文件数据方法解析
2018/12/29 Python
如何更优雅地写python代码
2019/07/02 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
《最可爱的人》教学反思
2014/02/14 职场文书
社区春季防火方案
2014/06/02 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
活着观后感
2015/06/03 职场文书
爱国电影观后感
2015/06/19 职场文书
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技