Spring Boot工程集成验证码生成与验证功能教程

小明 2025-05-05 16:55:52 7

🌟 前言

���迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

  • 🤖 洛可可白:个人主页

  • 🔥 个人专栏:✅前端技术 ✅后端技术

  • 🏠 个人博客:洛可可白博客

  • 🐱 代码获取: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
微信