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("用户名或密码错误");
        }
    }
}
相关推荐
ServBay40 分钟前
Claude Fable 5.5 测试曝光,但它在悄悄给你打分
后端·ai编程·claude
AI源码1 小时前
旅游推荐管理系统
spring boot
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
IT规划师2 小时前
一文讲透五种发布机制:滚动、蓝绿、金丝雀、红黑与 AB
后端·面试
SL_staff2 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
墨着染霜华2 小时前
Redocly 生成 OpenAPI 接口文档踩坑实录|Node 版本兼容 + 接口地址错误问题解决
java
文丑颜不良啊2 小时前
LeetCode1881~1990题目解析
java·leetcode
一条Go3 小时前
两套权限目录,三重闸门:Alioth 的多租户 RBAC 为什么这么拧
后端·程序员·github
Tokenfree3 小时前
把多模态 OCR 接进业务系统:四千张运单,三个坑
后端
十碗饭吃不饱3 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络