当前位置: 首页 > article >正文

SpringBoot集成easy-captcha图片验证码框架

SpringBoot集成easy-captcha图片验证码框架

此项目已经很久未维护,如有更好的选择,建议使用更好的选择!!!

一、引言

验证码(CAPTCHA)是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而,从零开发验证码模块需要处理图形渲染、算法设计、安全防护等诸多复杂问题。Easy-Captcha 作为一款轻量级开源验证码框架,以简洁的API和高度可定制性成为开发者的优选方案。下面我们将介绍如何将Easy-Captcha框架整合到SpringBoot项目中。

二、依赖

<dependency>
    <groupId>com.github.whvcse</groupId>
    <artifactId>easy-captcha</artifactId>
    <version>1.6.2</version>
</dependency>

三、代码

1. EasyCaptcha配置类

我们可以修改EasyCaptchaTypeEnum的枚举值来使用不同的验证码类型

@Configuration
@Data
public class EasyCaptchaConfig {

    /**
     * 验证码类型
     */
    private EasyCaptchaTypeEnum type = EasyCaptchaTypeEnum.GIF;

    /**
     * 验证码缓存过期时间(单位:秒)
     */
    private long ttl = 120L;

    /**
     * 验证码内容长度
     */
    private int length = 4;
    
    /**
     * 验证码宽度
     */
    private int width = 120;
    
    /**
     * 验证码高度
     */
    private int height = 36;

    /**
     * 验证码字体
     */
    private String fontName = "Verdana";

    /**
     * 字体风格
     */
    private Integer fontStyle = Font.PLAIN;

    /**
     * 字体大小
     */
    private int fontSize = 20;
    
}

2. EasyCaptchaTypeEnum枚举类

/**
 * @desc: EasyCaptcha 验证码类型枚举
 * @author: shy
 * @date: 2025/02/27 16:55
 */
public enum EasyCaptchaTypeEnum {

    /**
     * 算数
     */
    ARITHMETIC,
    /**
     * 中文
     */
    CHINESE,
    /**
     * 中文闪图
     */
    CHINESE_GIF,
    /**
     * 闪图
     */
    GIF,
    /**
     * png格式验证码
     */
    SPEC
}

3. 验证码生成器

/**
 * @desc: 验证码生成器
 * @author: shy
 * @date: 2025/02/27 16:59
 */
@Component
@RequiredArgsConstructor
public class EasyCaptchaProducer {

    private final EasyCaptchaConfig captchaConfig;

    public Captcha getCaptcha() {
        Captcha captcha;
        int width = captchaConfig.getWidth();
        int height = captchaConfig.getHeight();
        int length = captchaConfig.getLength();
        String fontName = captchaConfig.getFontName();

        switch (captchaConfig.getType()) {
            case ARITHMETIC:
                captcha = new ArithmeticCaptcha(width, height);
                //固定设置为两位,图片为算数运算表达式
                captcha.setLen(2);
                break;
            case CHINESE:
                captcha = new ChineseCaptcha(width, height);
                captcha.setLen(length);
                break;
            case CHINESE_GIF:
                captcha = new ChineseGifCaptcha(width, height);
                captcha.setLen(length);
                break;
            case GIF:
                captcha = new GifCaptcha(width, height);//最后一位是位数
                captcha.setLen(length);
                break;
            case SPEC:
                captcha = new SpecCaptcha(width, height);
                captcha.setLen(length);
                break;
            default:
                throw new RuntimeException("验证码配置信息错误!正确配置查看 CaptchaTypeEnum ");
        }
        // 使用默认字体即可解决中文乱码问题
        captcha.setFont(new Font(fontName, captchaConfig.getFontStyle(), captchaConfig.getFontSize()));
        return captcha;
    }
}

4. 验证码生成Service

/**
 * @desc: EasyCaptcha 业务类
 * @author: shy
 * @date: 2025/02/27 17:02
 */
@Component
@RequiredArgsConstructor
public class EasyCaptchaService {

    private final EasyCaptchaProducer easyCaptchaProducer;

    private final EasyCaptchaConfig captchaConfig;

    /**
     * 获取EasyCaptcha图片验证码
     *
     * @param
     * @return Captcha
     * @throws
     * @author shy
     * @date 2025/02/27 22:18
     */
    public Captcha getCaptcha() {
        // 获取验证码
        Captcha captcha = easyCaptchaProducer.getCaptcha();
        // 验证码文本
        String captchaText = captcha.text();
        // todo 验证码文本存储Redis比对
        System.out.println("验证码文本:" + captchaText);
        return captcha;
    }
}

5. 对外接口

@GetMapping("/getEasyCaptcha")
@ApiOperation(value = "获取EasyCaptcha图片验证码", notes = "获取EasyCaptcha图片验证码", httpMethod = "GET")
public void getEasyCaptcha() {
    Captcha captcha = captchaService.getCaptcha();
    try {
        captcha.out(response.getOutputStream());
        // 以上两种方式都可以输出图片验证码
        //CaptchaUtil.out(captcha, request, response);
    } catch (IOException e) {
        throw new RuntimeException();
    }
    super.getEasyCaptcha();
}

四、验证码展示

SHY QR Code 动态验证码 SHY QR Code 中文验证码 SHY QR Code png格式验证码

五、总结

Easy-Captcha 通过模块化设计平衡了安全性与开发效率,其源码结构清晰(仅核心类约15个),适合二次开发。无论是快速实现基础验证功能,还是构建企业级人机验证系统,该框架都能提供可靠支持。建议结合具体业务需求,在验证码样式、验证流程上做深度定制。

GitHub 地址:https://github.com/whvcse/EasyCaptcha


http://www.kler.cn/a/564399.html

相关文章:

  • Exoplayer(MediaX)实现音频变调和变速播放
  • mysql服务层介绍,NOSQL+SQL接口(nosql介绍),语法分析器,预处理器,优化器(优化的必要性,基于成本的优化器),缓存(弊端)
  • 【地图视界-Leaflet1】快速搭建你的第一个地图
  • IP-----动态路由OSPF
  • 【小白数学】为什么可以用拉格朗日乘子法求函数的极值【二】
  • 鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2
  • 火绒终端安全管理系统V2.0网络防御功能介绍
  • undo log、redo log、bin log是什么
  • C# Enumerable类 之 数据筛选
  • 世坤量化兼职体验
  • 高数1.1 函数
  • web网络安全---cookie篇
  • 关于houdini 调用api
  • MySQL中的DATETIME与TIMESTAMP选择指南
  • 生态系统服务权衡与协同动态分析:利用InVEST模型估算产水、固碳、生境质量和土壤保持;时空异质性、双变量分析、多元回归分析等
  • matlab机器人机械臂无人机python自动驾驶无人船控制规划ROS避障
  • 小白向-用python实现快速排序
  • CNN:卷积网络中设计1×1夹在主要卷积核如3×3前后的作用
  • 分布式事物在RocketMQ中的应用
  • (21)从strerror到strtok:解码C语言字符函数的“生存指南2”