1.JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <title>后台管理登录</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" href="${path}/portal/mana/css/login/bootstrap.css"/> <link rel="stylesheet" href="${path}/portal/mana/css/login/bootstrapValidator.css"/> <script type="text/javascript" src="${path}/portal/mana/scripts/login/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="${path}/portal/mana/scripts/login/bootstrap.min.js"></script> <script type="text/javascript" src="${path}/portal/mana/scripts/login/bootstrapValidator.js"></script> <style> body{ background: url("${path}/portal/mana/img/login.png") fixed center center no-repeat; background-size: cover; width: 100%; height: 100%; } </style> </head> <body> <div class="container"> <div class="auth-box"> <div class="row"> <div class="col-lg-5 col-lg-offset-3" style="margin-top: 25%;border: groove"> <div class="page-header"> <h3 style="text-align: center ;color: #0b5b97">后台管理登录</h3> </div> <form id="defaultForm" method="post" class="form-horizontal" action="${path}/portal/user/userLogin"> <div class="form-group"> <label class="col-lg-2 control-label">用户名</label> <div class="col-lg-9"> <input type="text" class="form-control" name="username" /> </div> </div> <div class="form-group"> <label class="col-lg-2 control-label">密码</label> <div class="col-lg-9"> <input type="password" class="form-control" name="password" /> </div> </div> <div class="form-group"> <label class="col-lg-2 control-label">验证码</label> <div class="col-lg-4"> <input type="text" class="form-control" name="code" /> </div> <div class="col-lg-5"> <img id="imgObj" alt="验证码" src="${path}/portal/code/getCode"> <a href="#" onclick="changeImg()">换一张</a> </div> </div> <c:choose> <c:when test="${message== '' || message== null}"> </c:when> <c:otherwise> <span style="color: red;">${message}</span> </c:otherwise> </c:choose> <div class="form-group"> <div class="col-lg-9 col-lg-offset-4"> <button type="submit" class="btn btn-primary" style="width: 40%">登录</button> </div> </div> <hr> </form> </div> </div> </div> </div>
<script language="javascript">//防止网页后退 history.pushState(null, null, document.URL); window.addEventListener('popstate', function () { history.pushState(null, null, document.URL); }); </script> <script type="text/javascript"> $(document).ready(function() { $('#defaultForm').bootstrapValidator({ message: 'This value is not valid', feedbackIcons: { valid: 'glyphicon glyphicon-ok', invalid: 'glyphicon glyphicon-remove', validating: 'glyphicon glyphicon-refresh' }, fields: { username: { message: '登录帐号不可用', validators: { notEmpty: { message: '登录账号不能为空' }, stringLength: { min: 5, max: 30, message: '登陆账号长度必须在5~30之间' }, remote: { type:"POST", message: '用户名不存在', url: '${path}/portal/user/checkUserName', data : { username:'username' },//这里默认会传递该验证字段的值到后端, delay: 2000,//每输入一个字符,就发ajax请求,服务器压力还是太大,设置2秒发送一次ajax(默认输入一个字符,提交一次,服务器压力太大) }, regexp: { regexp: /^[a-zA-Z]{1}([a-zA-Z0-9]|[_]){5,19}$/, message: '用户名必须以字母开头(可带数字、“_”)' } } }, code: { validators: { notEmpty: { message: '验证码不能为空' }, remote: { type:"POST", message: '验证码错误', url: '${path}/portal/code/checkCode', data : { code:'code' },//这里默认会传递该验证字段的值到后端, delay: 2000,//每输入一个字符,就发ajax请求,服务器压力还是太大,设置2秒发送一次ajax(默认输入一个字符,提交一次,服务器压力太大) } } }, password: { validators: { notEmpty: { message: '密码不能为空' }, stringLength: { min: 6, max: 30, message: '密码长度必须在6~20之间' } } } } }); }); function changeImg() { $("#code").val(""); 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, 20); if ((url.indexOf("&") >= 0)) { url = url + "×tamp=" + timestamp; } else { url = url + "?timestamp=" + timestamp; } return url; } } </script> </body> </html>
2.登录controller
import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.MailParseException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON; import com.portal.model.User; import com.portal.service.UserService; import com.portal.util.MD5Util; @Controller @RequestMapping(value = "/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/userLogin", produces="text/html;charset=UTF-8") public ModelAndView login(HttpServletRequest request,HttpSession session) throws UnsupportedEncodingException { request.setCharacterEncoding("utf-8"); ModelAndView mav = new ModelAndView(); String userName= request.getParameter("username"); String passWord= request.getParameter("password"); String code = request.getParameter("code"); String sessionCode = ""; try { sessionCode = request.getSession().getAttribute("code").toString(); } catch (NullPointerException e) { sessionCode = ""; } if (userName==null||"".equals(userName)||passWord==null||"".equals(passWord)||sessionCode==null||"".equals(sessionCode)) { mav.setViewName("/html/manage/manageLogin"); return mav; }else { if (code.equalsIgnoreCase(sessionCode)) { String pwd= MD5Util.MD5(passWord); User user= userService.login(userName, pwd); if (user!=null) { session.setAttribute("user", user); mav.setViewName("/html/manage/lotteryInfo"); return mav; }else { mav.setViewName("/html/manage/manageLogin"); mav.addObject("message", "密码错误,请重新登录!"); return mav; } }else { mav.setViewName("/html/manage/manageLogin"); mav.addObject("message", "验证码错误,请重新登录!"); return mav; } } } @PostMapping(value = "/checkUserName") @ResponseBody public String checkUserName(String username) { HashMap<String,Boolean> hashMap = new HashMap(); User user = userService.getUserByname(username); if (user != null ) { hashMap.put("valid",true); } else { hashMap.put("valid",false); } return JSON.toJSONString(hashMap); } }
3.验证码controller
import java.awt.image.RenderedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; 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.omg.CORBA.PUBLIC_MEMBER; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSON; import com.portal.util.CodeUtil; @Controller @RequestMapping(value = "/code") public class CodeController { @RequestMapping(value = "/getCode") public String getCode(HttpServletRequest req, HttpServletResponse resp) { // 调用工具类生成的验证码和验证码图片 Map<String, Object> codeMap = CodeUtil.generateCodeAndPic(); // 将四位数字的验证码保存到Session中。 HttpSession session = req.getSession(); session.setAttribute("code", codeMap.get("code").toString()); // 禁止图像缓存。 resp.setHeader("Pragma", "no-cache"); resp.setHeader("Cache-Control", "no-cache"); resp.setDateHeader("Expires", -1); resp.setContentType("image/jpeg"); // 将图像输出到Servlet输出流中。 ServletOutputStream sos; try { sos = resp.getOutputStream(); ImageIO.write((RenderedImage) codeMap.get("codePic"), "jpeg", sos); sos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @PostMapping(value = "/checkCode") @ResponseBody public String checkCode(HttpServletRequest request,String code) { HashMap<String,Boolean> hashMap = new HashMap(); String sessionCode = request.getSession().getAttribute("code").toString(); if (code != null && !"".equals(code) && sessionCode != null && !"".equals(sessionCode)) { if (code.equalsIgnoreCase(sessionCode)) { hashMap.put("valid",true); } else { hashMap.put("valid",false); } } else { hashMap.put("valid",false); } return JSON.toJSONString(hashMap); } }
4.验证码工具类
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.imageio.ImageIO; public class CodeUtil { private static int width = 90;// 定义图片的width private static int height = 35;// 定义图片的height private static int codeCount = 4;// 定义图片上显示验证码的个数 private static int xx = 15; private static int fontHeight = 24; private static int codeY = 24; private static 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' }; /** * 生成一个map集合 * code为生成的验证码 * codePic为生成的验证码BufferedImage对象 * @return */ public static Map<String,Object> generateCodeAndPic() { // 定义图像buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Graphics2D gd = buffImg.createGraphics(); // Graphics2D gd = (Graphics2D) buffImg.getGraphics(); 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 < 30; 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(36)]); // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。 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); } Map<String,Object> map =new HashMap<String,Object>(); //存放验证码 map.put("code", randomCode); //存放生成的验证码BufferedImage对象 map.put("codePic", buffImg); return map; } public static void main(String[] args) throws Exception { //创建文件输出流对象 OutputStream out = new FileOutputStream("D://img/"+System.currentTimeMillis()+".jpg"); Map<String,Object> map = CodeUtil.generateCodeAndPic(); ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out); System.out.println("验证码的值为:"+map.get("code")); } }
https://download.csdn.net/download/qq_35348457/10401315