Spring Boot工程集成验证码生成与验证功能教程
🌟 前言
���迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
-
🤖 洛可可白:个人主页
-
🔥 个人专栏:✅前端技术 ✅后端技术
-
🏠 个人博客:洛可可白博客
-
🐱 代码获取:bestwishes0203
-
📷 封面壁纸:洛可可白wallpaper
文章目录
- Spring Boot工程集成验证码生成与验证功能教程
- 1. 创建验证码工具类
- 2. 控制层实现
- 3. 客户端展示验证码
- 4. 验证验证码
- 📌 联系方式
- 🚀 获取源代码
- 🎉 结语
Spring Boot工程集成验证码生成与验证功能教程
验证码是一种常见的安全机制,用于防止自动化工具(如爬虫)对网站进行恶意操作。在Web应用中,验证码通常以图像的形式出现,要求用户输入图像中显示的字符。本文将介绍如何在Spring Boot工程中实现一个随机生成验证码的功能。
1. 创建验证码工具类
首先,我们需要创建一个工具类VerifyCodeUtils,用于生成随机验证码并输出为图像。
import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.Random; public class VerifyCodeUtils { //使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符 public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; private static Random random = new Random(); /** * 使用系统默认字符源生成验证码 * * @param verifySize 验证码长度 * @return */ public static String generateVerifyCode(int verifySize) { return generateVerifyCode(verifySize, VERIFY_CODES); } /** * 使用指定源生成验证码 * * @param verifySize 验证码长度 * @param sources 验证码字符源 * @return */ public static String generateVerifyCode(int verifySize, String sources) { if (sources == null || sources.length() == 0) { sources = VERIFY_CODES; } int codesLen = sources.length(); Random rand = new Random(System.currentTimeMillis()); StringBuilder verifyCode = new StringBuilder(verifySize); for (int i = 0; i 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } private static int getRandomIntColor() { int[] rgb = getRandomRgb(); int color = 0; for (int c : rgb) { color = color int[] rgb = new int[3]; for (int i = 0; i 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); g.copyArea(0, i, w1, 1, (int) d, 0); if (borderGap) { g.setColor(color); g.drawLine((int) d, i, 0, i); g.drawLine((int) d + w1, i, w1, i); } } } private static void shearY(Graphics g, int w1, int h1, Color color) { int period = random.nextInt(40) + 10; // 50; boolean borderGap = true; int frames = 20; int phase = 7; for (int i = 0; i > 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); g.copyArea(i, 0, 1, h1, 0, (int) d); if (borderGap) { g.setColor(color); g.drawLine(i, (int) d, i, 0); g.drawLine(i, (int) d + h1, i, h1); } } } }
2. 控制层实现
在Spring Boot的控制器中,我们需要提供一个接口来生成验证码并将其发送给客户端。
// VerifyController.java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class VerifyController { @GetMapping("https://blog.csdn.net/generateImageCode") public void generateImageCode(HttpSession session, HttpServletResponse response) throws IOException { //随机生成四位随机数 String code = VerifyCodeUtils.generateVerifyCode(4); //保存到session域中 session.setAttribute("code", code); //根据随机数生成图片,reqponse响应图片 response.setContentType("image/png"); ServletOutputStream os = response.getOutputStream(); VerifyCodeUtils.outputImage(130, 60, os, code); } }
3. 客户端展示验证码
在Web页面中,我们需要添加一个图像标签来展示验证码。
4. 验证验证码
在用户提交表单时,我们需要验证用户输入的验证码是否正确。这通常在后端进行,通过比较用户输入的验证码与Session中保存的验证码。
// 在登录方法中验证验证码 @PostMapping("/login") public ResponseEntity login(@RequestParam String username, @RequestParam String password, HttpSession session) { // 获取用户输入的验证码 String userInputCode = request.getParameter("code"); // 获取Session中保存的验证码 String sessionCode = (String) session.getAttribute("code"); // 验证验证码 if (!sessionCode.equals(inputCode)) { // 验证码错误 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("验证码错误"); } // 验证码正确,继续登录逻辑 // ... }
📌 联系方式
如果您对我们的项目感兴趣,或者有任何技术问题想要探讨,欢迎通过以下方式与我联系。我非常期待与您交流,共同学习,共同进步!🌊💡🤖
- 邮箱:2109664977@qq.com 📧
- Gitee:https://gitee.com/bestwishes0203 🐱
- GitHub:https://github.com/bestwishes0203 🐙
- CSDN主页:https://blog.csdn.net/interest_ing_/ 📖
- 个人博客:访问我的博客 🏠
🚀 获取源代码
- 后端案例:https://gitee.com/bestwishes0203/Front-end-example
- 前端案例:https://gitee.com/bestwishes0203/Back-end-example
🎉 结语
感谢你的访问,如果你对我的技术文章或项目感兴趣,欢迎通过以上方式与我联系。让我们一起在技术的道路上不断前行!🚀
The End