SpringBoot 登录验证码

验证码生成工具类

java 复制代码
package com.example.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class CaptchaGenerator {
    private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int CAPTCHA_LENGTH = 4;
    private static final Random random = new Random();

    /**
     * 获取创建验证码
     */
    public static String generateCaptcha() {
        StringBuilder captcha = new StringBuilder(CAPTCHA_LENGTH);

        for (int i = 0; i < CAPTCHA_LENGTH; i++) {
            int index = random.nextInt(CHARACTERS.length());
            captcha.append(CHARACTERS.charAt(index));
        }

        return captcha.toString();
    }

    /**
     * 创建验证码图片
     * @param captcha 验证码文本
     * @return 验证码图片
     */
    public static BufferedImage createCaptchaImage(String captcha) {
        int width = 120;
        int height = 40;

        // 创建图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();

        // 设置背景色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

        // 设置字体
        g.setFont(new Font("Arial", Font.BOLD, 20));

        // 绘制验证码
        for (int i = 0; i < captcha.length(); i++) {
            g.setColor(getRandomColor());
            int x = 20 + i * 20;
            int y = 25 + random.nextInt(10);
            g.drawString(String.valueOf(captcha.charAt(i)), x, y);
        }

        // 添加干扰线
        for (int i = 0; i < 5; i++) {
            g.setColor(getRandomColor());
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g.drawLine(x1, y1, x2, y2);
        }

        g.dispose();
        return image;
    }

    /**
     * 获取随机颜色
     * @return 随机颜色
     */
    private static Color getRandomColor() {
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        return new Color(r, g, b);
    }
}

获取验证码

java 复制代码
package com.example.controller;

import com.example.util.CaptchaGenerator;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

@RestController
@RequestMapping("/captcha")
public class CaptchaController {
    @GetMapping("/generate")
    public void generateCaptcha(HttpServletRequest request, HttpServletResponse response) {
        // 生成验证码
        String captcha = CaptchaGenerator.generateCaptcha();

        // 获取session并存储验证码
        HttpSession session = request.getSession();
        session.setAttribute("captcha", captcha);

        // 生成验证码图片
        BufferedImage image = CaptchaGenerator.createCaptchaImage(captcha);

        // 设置响应头
        response.setContentType("image/png");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);

        try {
            // 将图片写入响应流
            ImageIO.write(image, "png", response.getOutputStream());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

使用

java 复制代码
package com.example.controller;

import *******;

@RestController
@RequestMapping("/api")
public class LogApi {

    /**
     * 登录
     * @param params
     * username 用户名
     * password 密码
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody Map<String,String> params, HttpServletRequest request) throws Exception{
        String username = params.get("username");
        String password = params.get("password");
        String captcha = params.get("captcha"); // 获取用户输入的验证码
        // 获取session中的验证码
        HttpSession  session = request.getSession();
        String sessionCaptcha =  (String) session.getAttribute("captcha");

        // 检查验证码是否存在且匹配(忽略大小写)
        if (sessionCaptcha == null || !sessionCaptcha.equalsIgnoreCase(captcha)) {
            return R.failure("验证码错误");
        }
        // 验证通过后移除验证码,防止重复使用
        session.removeAttribute("captcha");

        if(username.equals("admin") && password.equals("password")){
            String s = JwtTokenUtil.generateToken(username, password);
            return R.ok(s);
        }else {
            return R.failure("用户名或密码错误");
        }
    }
}
相关推荐
952365 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S7 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全8 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje8 小时前
Java语法进阶
java·开发语言·jvm
uzong9 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan9 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv79 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫9 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287929 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本9 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka