本文使用SpringBoot实现Thymeleaf验证码生成,使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。感兴趣的可以了解下
使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。
本篇用SpringBoot Thymeleaf实现验证码生成。
创建springboot项目 引入依赖
完整pom.xml
4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE com.example web 0.0.1-SNAPSHOT web Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-maven-plugin
application.yml配置 Thymeleaf
#Thymeleaf配置 spring: mvc: static-path-pattern: /** thymeleaf: mode: HTML encoding: UTF-8 #关闭缓存 cache: false
创建CaptchaController.java 类
package com.example.web.controller; import com.example.web.util.VerifyCode; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; @RestController public class CaptchaController { /* 获取验证码图片*/ @RequestMapping("/getVerifyCode") public void getVerificationCode(HttpServletResponse response, HttpServletRequest request) { try { int width = 200; int height = 69; BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//生成对应宽高的初始图片 String randomText = VerifyCode.drawRandomText(width, height, verifyImg);//单独的一个类方法,出于代码复用考虑,进行了封装。功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符 request.getSession().setAttribute("verifyCode", randomText); response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别 OutputStream os = response.getOutputStream(); //获取文件输出流 ImageIO.write(verifyImg, "png", os);//输出图片流 os.flush(); os.close();//关闭流 } catch (IOException e) { e.printStackTrace(); } } }
创建VerifyCode.java 工具类
package com.example.web.util; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; public class VerifyCode { public static String drawRandomText(int width, int height, BufferedImage verifyImg) { Graphics2D graphics = (Graphics2D) verifyImg.getGraphics(); graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色 graphics.fillRect(0, 0, width, height);//填充背景 graphics.setFont(new Font("微软雅黑", Font.BOLD, 40)); //数字和字母的组合 String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; StringBuilder builder = new StringBuilder(); int x = 10; //旋转原点的 x 坐标 String ch; Random random = new Random(); for (int i = 0; i <4; i++) { graphics.setColor(getRandomColor()); //设置字体旋转角度 int degree = random.nextInt() % 30; //角度小于30度 int dot = random.nextInt(baseNumLetter.length()); ch = baseNumLetter.charAt(dot) + ""; builder.append(ch); //正向旋转 graphics.rotate(degree * Math.PI / 180, x, 45); graphics.drawString(ch, x, 45); //反向旋转 graphics.rotate(-degree * Math.PI / 180, x, 45); x += 48; } //画干扰线 for (int i = 0; i <6; i++) { // 设置随机颜色 graphics.setColor(getRandomColor()); // 随机画线 graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //添加噪点 for (int i = 0; i <30; i++) { int x1 = random.nextInt(width); int y1 = random.nextInt(height); graphics.setColor(getRandomColor()); graphics.fillRect(x1, y1, 2, 2); } return builder.toString(); } /** * 随机取色 */ private static Color getRandomColor() { Random ran = new Random(); return new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); } }
创建UserController.java 类
package com.example.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/login") public String login() { return "login"; } }
resources/templates目录下创建login.html
启动项目访问http://localhost:8080/login
点击图片可以更换验证码,至于后面的后台验证就不讲了。
参考文章后台java 实现验证码生成
以上就是SpringBoot实现Thymeleaf验证码生成的详细内容,更多请关注0133技术站其它相关文章!