java 如何实现登陆和注册的验证码功能
2017-11-07 23:22
639 查看
以下是 java 实现登陆和注册的验证码功能
java 实现登陆和注册的验证码有插件可以实现,但这里收录的代码不是用插件的方式,界面有点丑,但也是一种实现方式。login.jsp如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>登陆页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <script type="text/javascript" src="js/jquery-1.8.3.js"></script> <script type="text/javascript" src="js/login.js"></script> </head> <body> <h3>${mess }</h3> <form action="login.action" method="post"> <table> <tr> <td></td> <td><h3>请登陆用户名</h3></td> <td></td> </tr> <tr> <td>用户名:</td> <td><input type="text" name="uname" /></td> <td></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="pwd" "/></td> <td></td> </tr> <tr> <td>验证码:</td> <td><input type="text" name="verifyCode" /></td> <td> <img id="code" src="verify/code.action"> <a id="refresh">看不清,换一张</a> </td> </tr> <tr> <td></td> <td><input type="submit" name="login" value="登陆"/><input type="button" name="register" value="注册"/></td> <td></td> </tr> </table> </form> </body> </html>
login.js如下:
$(function(){ $("table").css({"border":"1px solid red","margin":"0px auto"}); $("input[name='register']").click(function(){ window.location = "register.jsp"; }); $("form").submit(function(){ var uname=$("input[name=uname]").val(); var pwd=$("input[name=pwd]").val(); if(uname==""||uname==null){ alert("用户名不能为空!"); return false; }else if(pwd==""||pwd==null){ alert("密码不能为空!"); return false; }else{ var code = $("input[name=verifyCode]").val(); var flag = true; if(code == ""){ alert("验证码不能为空!"); return false; }else{ $.ajax({ url:"verify/checkVerifyCode.action", type:"post", data:{"verifyCode":code}, dataType:"text", async:false, success:function(result){ if(result == "false"){ alert("验证码输入不正确!"); flag = false; } } }); return flag; } } }); // 刷新验证码 $("#refresh").unbind("click").bind("click", function(){ $("#code").attr("src", "verify/code.action?r=" + Math.random()); }); });
控制器代码如下:
package com.user.controllers; import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; @Controller @RequestMapping("verify") public class VerifyCodeController { // 验证码图片的宽度。 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 ="80"; // 高度 String strHeight ="30"; // 字符个数 String strCodeCount = "4"; // 将配置的信息转换成数值 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; } /** * 生成验证码 *TODO *LIU * @param req * @param resp * @throws ServletException * @throws java.io.IOException *下午12:36:55 */ @RequestMapping(value="/code.action",method= RequestMethod.GET) public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { init(); // 定义图像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 < 20; 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(); } /** * 验证验证码是否匹配 *TODO *LIU * @param verifyCode * @param req * @param resp * @return *下午12:37:50 */ @RequestMapping(value="/checkVerifyCode.action",method= RequestMethod.POST) @ResponseBody public Object checkVerifyCode(@RequestParam(value = "verifyCode") String verifyCode,HttpServletRequest req, HttpServletResponse resp){ JSONObject jsobjcet = new JSONObject(); String flag = "false"; if(verifyCode!=null){ HttpSession session = req.getSession(); String validateCode= (String) session.getAttribute("validateCode"); if(validateCode!=null&&validateCode.equals(verifyCode.toUpperCase())){ jsobjcet.put("valid", true); flag = "true"; }else{ jsobjcet.put("valid", false); flag = "false"; } }else{ jsobjcet.put("valid", false); flag = "false"; } // return jsobjcet; return flag; } }
相关文章推荐
- php实现Ajax带有验证码的登陆注册功能
- JAVA简单链接Oracle数据库,实现注册和登陆的功能
- java在线聊天项目1.2版 ——开启多个客户端,分别实现数据库注册和登录功能后,成功登陆则登录框消失,好友列表窗出现
- Java如何实现验证码验证功能
- 如何在struts2中实现登陆的验证码功能
- Java 使用ArrayList集合实现注册登陆功能
- MyBlog部分模块---基于Servlet+JSP+JavaBean实现登陆注册验证功能
- 如何在struts2中实现登陆的验证码功能
- 关于JavaWeb如何实现用户注册 后台即时提醒(类似站内信功能)
- Java用户注册服务器发送短信验证码功能实现
- JAVA简单链接Oracle数据库 注册和登陆功能的实现代码
- Java_JSP_JSP如何实现验证码功能;
- java collection 之用法,登陆注册功能的实现
- JAVA-如何实现TIMER功能
- 教你用Java安全有效的实现两星期内自动登陆功能-Session
- Java实现随机验证码功能
- Java实现随机验证码功能实例
- 使用Java程序实现随机验证码功能的实例
- sso-cas全攻略(java版)------cas如何加验证码功能
- 如何在Java应用程序中实现FTP功能