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

 更新时间:2016年5月20日 10:01  点击:2311

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实现无刷新验证码的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

[!--infotagslink--]

相关文章

  • jquery实现加载更多"转圈圈"效果(示例代码)

    这篇文章主要介绍了jquery实现加载更多"转圈圈"效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10
  • 自己动手写的jquery分页控件(非常简单实用)

    最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了。写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性...2015-10-30
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • jQuery实现非常实用漂亮的select下拉菜单选择效果

    本文实例讲述了jQuery实现非常实用漂亮的select下拉菜单选择效果。分享给大家供大家参考,具体如下:先来看如下运行效果截图:在线演示地址如下:http://demo.jb51.net/js/2015/js-select-chose-style-menu-codes/具体代码如...2015-11-08
  • jquery实现的伪分页效果代码

    本文实例讲述了jquery实现的伪分页效果代码。分享给大家供大家参考,具体如下:这里介绍的jquery伪分页效果,在火狐下表现完美,IE全系列下有些问题,引入了jQuery1.7.2插件,代码里有丰富的注释,相信对学习jQuery有不小的帮助,期...2015-10-30
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • jQuery 2.0.3 源码分析之core(一)整体架构

    拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过,不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍我也不会照本宣科的翻译...2014-05-31
  • jQuery页面加载初始化常用的三种方法

    当页面打开时我们需要执行一些操作,这个时候如果我们选择使用jquery的话,需要重写他的3中方法,自我感觉没什么区 别,看个人喜好了,第二种感觉比较简单明了: 第一种: 复制代码 代码如下: <script type="text/javas...2014-06-07
  • jquery中常用的SET和GET$(”#msg”).html循环介绍

    复制代码 代码如下: $(”#msg”).html(); //返回id为msg的元素节点的html内容。 $(”#msg”).html(”new content“); //将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content $(”...2013-10-13
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • jQuery Mobile开发中日期插件Mobiscroll使用说明

    这篇文章主要介绍了jQuery Mobile开发中日期插件Mobiscroll使用说明,需要的朋友可以参考下...2016-03-03
  • jQuery实现切换页面过渡动画效果

    直接为大家介绍制作过程,希望大家可以喜欢。HTML结构该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进...2015-10-30
  • jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果

    本文实例讲述了jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果。分享给大家供大家参考,具体如下:这里演示jQuery实现鼠标移动到链接上,滑动展开/隐藏图片效果,鼠标放在“上一页”“下一页”上,立即浮现出所对应的图...2015-10-30
  • jQuery实现广告显示和隐藏动画

    这篇文章主要为大家详细介绍了jQuery实现广告显示和隐藏动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-05
  • jQuery+PHP发布的内容进行无刷新分页(Fckeditor)

    这篇文章将使用jQuery,并结合PHP,将Fckeditor发布的内容进行分页,并且实现无刷新切换页面。 本文假设你是WEB开发人员,掌握了jQuery和PHP相关知识,并且熟知Fckeditor的配置和使用。...2015-10-23
  • jQuery实现带玻璃流光质感的手风琴特效

    jQuery实现带玻璃流光质感的手风琴特效是一款基于jQuery+CSS3实现的带玻璃流光质感的手风琴特效,分享给大家,具体如下效果图:具体代码如下:html代码: <section class="strips"> <article class="strips__strip"> <di...2015-11-24
  • 使用JQuery实现Ctrl+Enter提交表单的方法

    有时候我们为了省事就操作键盘组合键去代替使用鼠标,我们今天就使用JQuery实现Ctrl+Enter提交表单。我们发帖时,在内容输入框中输入完内容后,可以点击“提交”按钮来发表内容。可是,如果你够“懒”,你可以不用动鼠标,只需按...2015-10-23
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • jquery validate demo 基础

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自...2015-10-30