内容比较简单,需要完整项目的朋友留下邮箱,给你们发。

直接看效果:

下面是实现步骤

1.验证码生成工具类(引用自网络)

package com.laoxu.test.helloweb.util;import javax.imageio.ImageIO;
import java.awt.*;
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;/*** @Description: 原始验证码生成工具* @Author laoxu* @Date 2019/11/2 23:01**/
public class VerifyCodeUtil {private  int width = 90;// 定义图片的widthprivate  int height = 20;// 定义图片的heightprivate static int codeCount = 4;// 定义图片上显示验证码的个数private static int xx = 15;private  int fontHeight = 18;private static  int codeY = 16;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(int width, int height, int fontHeight) {// 定义图像bufferBufferedImage 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://tmp/"+System.currentTimeMillis()+".jpg");Map<String,Object> map = VerifyCodeUtil.generateCodeAndPic(90,20,18);ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);System.out.println("验证码的值为:"+map.get("code"));}
}

2.写登录页

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页</title><link rel="stylesheet" href="css/bootstrap.min.css"><link rel="stylesheet" href="css/login.css">
</head>
<body class="text-center">
<form class="form-signin"><h1 class="h3 mb-3 font-weight-normal">请登录</h1><label for="username" class="sr-only">用户名:</label><input type="text" id="username" class="form-control" placeholder="" required="required" autofocus=""><label for="password" class="sr-only">密码:</label><input type="password" id="password" class="form-control" placeholder="" required="required"><div class="verify-div"><label for="verify-code" class="sr-only">验证码:</label><input type="text" id="verify-code" style="width: 50%;" class="form-control" placeholder="" required="required"><a href="#" onclick="changeVerifyCode()"><img id="imgObj" alt="验证码" src="/getVerifyCode"></a></div><button class="btn btn-lg btn-primary btn-block" type="submit" id="submit">登录</button>
</form>
</body>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">$(function() {$("#submit").click(function (event) {// 阻止表单默认提交event.preventDefault();var username = $("#username").val(), password = $("#password").val(),verifyCode=$("#verify-code").val();if(username==""){alert("用户名不能为空!");return;}if(password==""){alert("密码不能为空!");return;}if(verifyCode==""){alert("验证码不能为空!");return;}// 提交验证$.ajax({type: "POST",url: "/checkLogin",data: {"username": username,"password": password,"verifyCode": verifyCode},success: function (result) {if(result=='success'){window.location.href="http://localhost:8080/success.html";}else{alert(result);}}});});});function changeVerifyCode() {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>
</html>

3.写controller

package com.laoxu.test.helloweb;import com.laoxu.test.helloweb.util.VerifyCodeUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.util.Map;/*** @Description:* @Author laoxu* @Date 2019/11/2 13:35**/
@Controller
public class LoginController {@RequestMapping("/login")public String index(){return "forward:/login.html";}@RequestMapping("/getVerifyCode")public void getVerifyCode(HttpServletRequest request, HttpServletResponse response){// 调用工具类生成的验证码和验证码图片Map<String, Object> codeMap = VerifyCodeUtil.generateCodeAndPic(90,20,18);// 将四位数字的验证码保存到Session中。HttpSession session = request.getSession();session.setAttribute("verifyCode", codeMap.get("code").toString().toUpperCase());// 禁止图像缓存。response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", -1);response.setContentType("image/jpeg");// 将图像输出到Servlet输出流中。ServletOutputStream sos;try {sos = response.getOutputStream();ImageIO.write((RenderedImage) codeMap.get("codePic"), "jpeg", sos);sos.close();} catch (IOException e) {e.printStackTrace();}}@ResponseBody@RequestMapping("/checkLogin")public String checkLogin(@RequestParam String username,@RequestParam String password,@RequestParam String verifyCode,HttpServletRequest request){String sessionVerifyCode = (String) request.getSession().getAttribute("verifyCode");if(!"admin".equals(username)){return "用户名错误!";}if(!"123".equals(password)){return "密码错误!";}if(!sessionVerifyCode.equals(verifyCode.toUpperCase())){return "验证码错误!";}return "success";}
}

需要完整项目的朋友留下邮箱。

spring boot实现验证码登录相关推荐

  1. logback redis_使用Spring Boot和Logback登录到Redis

    logback redis 在进行集中式日志记录时,例如使用Elasticsearch,Logstash和Kibana或Graylog2,您可以为Java应用程序提供多个选项. 您既可以编写标准的应用 ...

  2. 使用Spring Boot和Logback登录到Redis

    在进行集中式日志记录时,例如使用Elasticsearch,Logstash和Kibana或Graylog2,您可以为Java应用程序提供几个选项. 您既可以编写标准的应用程序日志,也可以使用Logs ...

  3. Spring Boot 入门之登录创建

    Spring Boot 入门之登录创建 一.在IDEA中创建一个springboot项目 1.使用Spring Initializr创建项目 2.选定Developer Tools中的Spring B ...

  4. Spring Boot集成第三方登录之微信登录

    Spring Boot集成第三方登录之微信登录 准备工作 注册 创建网站应用 网站应用开发指南 授权流程 请求CODE 获取access_token 使用access_token调用接口 获取用户个人 ...

  5. Spring Boot集成第三方登录之微博登录

    Spring Boot集成第三方登录之微博登录 准备工作 网站接入 开发者信息认证 创建应用 流程分析 引导授权用户 用户授权 授权成功 换取Access Token HTTP客户端 使用Access ...

  6. Spring Boot实现验证码功能

    ✨Spring Boot实现验证码功能 验证码的作用 案例要求 前端页面准备 随机验证码工具类 后端控制器 测试

  7. vue配置文件读取_Vue+Spring Boot简单用户登录Demo实现

    ❝ 「如果觉得文章好看,欢迎点赞.」「同时欢迎关注微信公众号:氷泠之路.」 ❞ 这是一个前后端分离的简单用户登录Demo. 技术栈 Vue BootstrapVue Kotlin Spring Boo ...

  8. Spring boot拦截器登录检查

    拦截器 进行登录检查 从登录页面跳转到成功页面之后 为了防止表单重复提交 配置视图映射,利用重定向到成功页面 此时,在浏览器直接输入,配置的视图映射地址 也可以直接映射.跳转到成功页面 登录页面,也就 ...

  9. Spring Boot 实现单点登录的第三种方案!

    前面松哥发过两篇文章,也是两种方案,讲到单点登录问题: OAuth2+JWT 方案 @EnableOAuth2Sso 注解方案 今天再来和大家介绍第三种方案,使用 Spring Security 开发 ...

最新文章

  1. 显著增加bash交互舒适度的.inputrc
  2. GNN笔记:傅里叶变换
  3. 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构
  4. 一次PostgreSQL行估算偏差导致的慢查询分析
  5. 触发器与约束的适用条件
  6. C/C++中“空语句”的说明
  7. python判断语句的复杂度_Python内置方法的时间复杂度(转)
  8. 4799元!OPPO Reno巴萨定制版开启预售:7月26日正式开售
  9. MATLAB 2018a安装
  10. 淘宝宝贝改关键词有影响吗?如何修改?
  11. 【笔记】统计pdf文件中的字数
  12. 南阳oj 韩信点兵
  13. 桶装水同城预订下单送水小程序开发制作(水站桶装水配送系统)
  14. pandas学习task05变形
  15. DFS回溯-函数递归-xiaoz triangles
  16. 《Python股票量化交易从入门到实践》随书赠送“回测框架”的使用帮助
  17. 如何打开计算机任务管理器,电脑任务管理器怎么打开
  18. 考研英语 - word-list-19
  19. 巧妙下载校VOD电影
  20. 《信息学奥赛》1354:括弧匹配检验

热门文章

  1. RAM和ROM(verilog)
  2. flutter中播放音乐
  3. mysql errno: 1146_解决MySQL复制出错 Last_SQL_Errno:1146
  4. linux cpu数理,Linux中的 德·摩根定律
  5. 使用SC 修改服务启动账户
  6. 小议车辆环境视觉基础前视感知
  7. 使用svg-sprite-loader 遇到的问题
  8. Android箭头图标移动动画实现
  9. java listener 模式_Java和GUI-根据MVC模式,ActionListener属于哪里?
  10. 模板文件如何调用php函数,模板文件调用方法与路径