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("用户名或密码错误");
        }
    }
}
相关推荐
Configure-Handler21 小时前
buildroot System configuration
java·服务器·数据库
:Concerto21 小时前
JavaSE 注解
java·开发语言·sprint
电商API_180079052471 天前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序1 天前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹1 天前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_949809591 天前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
vx_BS813301 天前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868361 天前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐1 天前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜1 天前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划