浅谈用jQuery兑现无刷新验证码
浅谈用jQuery实现无刷新验证码1.思路: 页面上的验证码图片是servlet,采用jquery实现异步校验信息 ?2.所用
浅谈用jQuery实现无刷新验证码
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? ?
- ?Java代码? ?
- function?changeImg(){??? ?????var?imgSrc?=?$("#imgObj");??? ?
- ????var?src?=?imgSrc.attr("src");??? ?????imgSrc.attr("src",chgUrl(src));??? ?
- }??? ?//时间戳??? ?
- //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳??? ?function?chgUrl(url){??? ?
- ????var?timestamp?=?(new?Date()).valueOf();??? ?????urlurl?=?url.substring(0,17);??? ?
- ????if((url.indexOf("&")>=0)){??? ?????????urlurl?=?url?+?"×tamp="?+?timestamp;??? ?
- ????}else{??? ?????????urlurl?=?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(); ??urlurl?=?url.substring(0,17); ?
- ?if((url.indexOf("&")>=0)){ ???urlurl?=?url?+?"×tamp="?+?timestamp; ?
- ?}else{ ???urlurl?=?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? ?
- ?Java代码? ?
- <%@?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>???? ?
- [url]http://www.javaeye.com/post/608953#[/url]????