springmvc+spring+mybatis+maven+mysql项目(二)Springmvc + ajax 实现javaweb验证码的制作及进行异步验证
2016-03-17 20:53
806 查看
为了继续完善上次的项目,这次我在原有的基础上增加了登录注册模块的验证码验证防止恶意登录注册等行为
在控制器中加入下列代码:
为了将提示信息展示出来,在jsp页面中加入
如下:
该功能不用引入额外的jar包
javaweb验证码的制作
package com.zr.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @ClassName: CodeController * @Description:生成验证码控制器 * @author byvain * @date 2016年3月15日 下午8:04:47 * */ @Controller @RequestMapping("/admin") public class CodeController { private int width = 90;// 定义图片的width private int height = 40;// 定义图片的height private int codeCount = 4;// 定义图片上显示验证码的个数 private int xx = 15; private int fontHeight = 30; private int codeY = 35; 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' }; @RequestMapping("/code") public void getCode(HttpServletRequest req, HttpServletResponse resp) throws IOException { // 定义图像buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics gd = buffImg.getGraphics(); // 创建一个随机数生成器类 Random random = new Random(); // 将图像填充为白色 gd.setColor(Color.WHITE); gd.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定。 Font font = new Font("Fixedsys", Font.BOLD, fontHeight); // 设置字体。 gd.setFont(font); // 画边框。 gd.setColor(Color.BLACK); gd.drawRect(0, 0, width - 1, height - 1); // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。 gd.setColor(Color.BLACK); for (int i = 0; i < 40; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); gd.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 code = String.valueOf(codeSequence[random.nextInt(codeSequence.length-1)]); // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); // 用随机产生的颜色将验证码绘制到图像中。 gd.setColor(new Color(red, green, blue)); gd.drawString(code, (i + 1) * xx, codeY); // 将产生的四个随机数组合在一起。 randomCode.append(code); } // 将四位数字的验证码保存到Session中。 HttpSession session = req.getSession(); System.out.print(randomCode); session.setAttribute("code", 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(); } }
jsp页面中引入制作好的验证码:
<div> <input type="text" id="code" name="code"/> <img id="codeImg" alt="验证码" src="admin/code" onclick="changeImg();"/> <label onclick="changeImg();">点击刷新 </label> </div>
ajax实现验证码的异步验证
js文件中ajax代码:function showHint(str) { var xmlhttp; if (str.length==0) { document.getElementById("myDiv").innerHTML="";//登录中的提示,在未输入信息时清空 document.getElementById("myDiv2").innerHTML="";//注册中的提示,,在未输入信息时清空 return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText;//在登录模块中输出 document.getElementById("myDiv2").innerHTML=xmlhttp.responseText;//在注册模块中输出 } } xmlhttp.open("GET","user/validate?code="+str,true); xmlhttp.send(); }
在控制器中加入下列代码:
//检验验证码是否正确 @RequestMapping("/validate") public void login(HttpServletRequest request,HttpServletResponse response) throws IOException{ HttpSession session = request.getSession(); response.setContentType("text/html;charset=UTF-8"); if(request.getParameter("code").length() == 4){ if(request.getParameter("code").equalsIgnoreCase(session.getAttribute("code").toString())){ response.getWriter().write("验证码输入正确"); }else{ response.getWriter().write("验证码输入错误,请重新输入"); } }else{ response.getWriter().write("请输入四位验证码,不区分大小写"); } }
为了将提示信息展示出来,在jsp页面中加入
如下:
<div> <input type="text" id="code" name="code"/> <img id="codeImg" alt="验证码" src="admin/code" onclick="changeImg();"/> <label onclick="changeImg();">点击刷新 </label> <div id="myDiv"></div> </div>
该功能不用引入额外的jar包
相关文章推荐
- 《深入Java虚拟机》笔记:指令集 (转)
- 回溯法(试探法)生成彩票号码组合(java)
- Java学习笔记(一)对象与类
- jni编程,使用javah命令生成方法签名头文件
- java作业之定义Date类,功能:判断输入的是否为闰年。。。
- 眼睛跟踪 java
- JAVA总结2
- Java高级部分组件重点总结
- [java]多态
- java访问控制符和权限
- JAVA几种常见的设计模式
- 简单Struts2实例(入门级)
- Java学习笔记-泛型
- 贪心算法换零钱(java)
- Java中MD5加密算法的实现
- 【最全版】Java正则表达式判断手机号码【2014版】
- java八大基本类型
- java抽象类与接口的区别
- Java Unit -- Generic
- Java集合框架:LinkedList