登录页面添加图形验证码功能
2019-07-18 14:19
260 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43193265/article/details/96429142
之前前辈写的登录表单还是提交到同一个页面,前端直接读取用户输入的验证码与session并不同步,所以使用ajax将用户输入传递到后台进行验证,这样也更安全。
生成验证码validatecode.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Random"%> <%@ page import="java.io.OutputStream"%> <%@ page import="java.awt.Color"%> <%@ page import="java.awt.Font"%> <%@ page import="java.awt.Graphics"%> <%@ page import="java.awt.image.BufferedImage"%> <%@ page import="javax.imageio.ImageIO"%> <% //设置页面不缓存 response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-catch"); response.setDateHeader("Expires",0); int width = 80; int height = 32; //create the image BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // set the background color g.setColor(new Color(0xDCDCDC)); g.fillRect(0, 0, width, height); // draw the border g.setColor(Color.black); g.drawRect(0, 0, width - 1, height - 1); // create a random instance to generate the codes Random rdm = new Random(); String hash1 = Integer.toHexString(rdm.nextInt()); //System.out.print(hash1); // make some confusion for (int i = 0; i < 50; i++) { int x = rdm.nextInt(width); int y = rdm.nextInt(height); g.drawOval(x, y, 0, 0); } // generate a random code String capstr = hash1.substring(0, 4); session.setAttribute("key", capstr); // 将验证码放入request g.setColor(new Color(0, 100, 0)); g.setFont(new Font("Candara", Font.BOLD, 24)); g.drawString(capstr, 8, 24); g.dispose(); response.setContentType("image/jpeg"); out.clear(); out = pageContext.pushBody(); OutputStream strm = response.getOutputStream(); ImageIO.write(image, "jpeg", strm); strm.close(); %>
前端代码login.jsp:
<div class="loginFormContent"> <form id="loginForm" action="${ctx }/login.jsp" method="post" > <div id="loginTabContent" > <div id="login-error" class="errorMsg" style="color: red;padding-left: 60px;"></div> <div class="dlcLeft"> <div class="frmItem"> <label for="" class="frm_label">工号</label> <div class="frm_controls"> <input id="username" type="text" class="frm-controlM" name="username" value="" > </div> </div> <div class="frmItem"> <label for="" class="frm_label">密码</label> <div class="frm_controls"> <input type="password" name="password" id="passwordInput" class="frm-controlM" value="" > </div> </div> <%--图形验证码--%> <div class="frmItem"> <label for="" class="frm_label">验证码</label> <div class="frm_controls"> <input type="text" id="checkcode" name="checkcode"/> <img class="btnSearch" id="code" src="${pageContext.request.contextPath }/validatecode.jsp" onclick="loadimage();" /> </div> </div> <div class="frmItem" style="padding: 6px 5px;"> <label for="" class="frm_label"> </label> <input type="button" value=" 登 录 " class="btnGreen" style="width: 330px;height: 45px;" onclick="checkInput()"/> </div> </div> </div> </form> </div>
后台处理CheckCodeServlet:
package com.key.common.plugs.security; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; public class CheckCodeServlet extends HttpServlet { public CheckCodeServlet(){ super(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); int flag=-1; HttpSession session = request.getSession(); String realKey = (String) session.getAttribute("key"); String userKey = request.getParameter("userKey"); //不区分大小写 if(realKey != null && !realKey.trim().equals("")){ realKey = realKey.toLowerCase(); } if (realKey != null && !realKey.trim().equals("")){ realKey = realKey.toLowerCase(); } //验证码 if(userKey==null || userKey==""){ flag = -1; }else if(realKey.equals(userKey) || realKey==userKey){ flag=1; }else{ flag=0; } //如果两个验证码一致,并移除sesssion域中的属性值 //session.removeAttribute("key"); //String code = realKey+"-"+userKey+"-"+flag; out.println(flag); out.flush(); out.close(); } }
CheckCodeServlet的web.xml路径配置:
<servlet> <servlet-name>checkCode</servlet-name> <servlet-class>com.key.common.plugs.security.CheckCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>checkCode</servlet-name> <url-pattern>/checkCode</url-pattern> </servlet-mapping>
验证:
function checkInput() { var userKey=$("#checkcode").val(); $.ajax({ type: "POST", url: "checkCode", data: {userKey: userKey}, success: function(msg){ //console.log(typeof msg); String if(eval(msg)=="-1"){ document.getElementById("login-error").innerHTML="请输入验证码"; //alert("验证码输入不能为空"); }else if(eval(msg) == "1"){ $("#passwordInput").val(hex_md5($("#passwordInput").val())); $("#loginForm").submit(); }else if(eval(msg) == "0"){ document.getElementById("login-error").innerHTML="验证码输入错误"; setTimeout(function(){ window.location.reload(); },1000); } } }) } //切换验证码图片 function loadimage(){ document.getElementById("code").src = "${pageContext.request.contextPath }/validatecode.jsp?"+Math.random(); }
结果页:
相关文章推荐
- JSP实现登录功能之添加验证码
- java实现登录页面的验证码功能
- [原创]用Ajax制作带图形验证码的登录页面
- 如何给登录页面添加一个验证是否是机器登录的方式(验证码)
- 【学习笔记⑦】登录页面怎样实现验证码登录功能
- 项目部署到阿里云登录页面图形验证码乱码问题的解决办法
- cas服务器登录页面添加验证码
- SSM初入门( 七)在登录界面添加图形验证码
- java spring 实现登录页面添加验证码
- 项目部署到阿里云 登录页面图形验证码乱码
- 登录验证---添加验证码验证,Cookie保存功能
- 使用Servlet实现图形验证码登录页面
- jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码
- 登录页面的验证码的生成
- Jfinal框架登陆页面的图形验证码
- python实现的douban.fm客户端,添加登录功能
- 登录页面上的验证码的生成
- PHP实现注册登录功能完整教程及代码 含验证码
- spring-boot 添加JSP页面功能
- Android手机联系人源码(添加联系人页面一个功能)修改