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中动态新增的元素节点无法触发事件问题的两种方法
Oct 30 Javascript
jquery.cookie.js用法实例详解
Dec 25 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
js实现适配不同的屏幕大小
Apr 10 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
javascript 取小数点后几位几种方法总结
Aug 02 Javascript
js定时器+简单的动画效果实例
Nov 10 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
微信小程序实现消息框弹出动画
Apr 18 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 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
php下过滤HTML代码的函数
2007/12/10 PHP
PHP里的中文变量说明
2011/07/23 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
jQuery实现图片左右滚动特效
2020/04/20 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
python简单实现刷新智联简历
2016/03/30 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python函数返回不定数量的值方法
2019/01/22 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
项目经理的岗位职责
2013/11/23 职场文书
财务部出纳岗位职责
2013/12/22 职场文书
自荐信如何制作?
2014/02/21 职场文书
信息技术培训感言
2014/03/06 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
工业设计专业自荐书
2014/06/05 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
2014年调度员工作总结
2014/11/19 职场文书
校长新学期致辞
2015/07/30 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang