SpringBoot集成图片验证码框架easy-captcha的详细过程

 更新时间:2025年03月04日 11:23:39   作者:shy好好学习  
本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是一款轻量级的开源验证码框架,通过简洁的API和高度可定制性,可以快速实现验证码功能,文章详细介绍了如何配置、生成和展示验证码,并提供了Easy-Captcha的GitHub地址

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

到此这篇关于SpringBoot集成图片验证码框架easy-captcha的文章就介绍到这了,更多相关SpringBoot验证码easy-captcha内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java零基础精通方法篇

    Java零基础精通方法篇

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-05-05
  • Java 超详细讲解SpringMVC拦截器

    Java 超详细讲解SpringMVC拦截器

    Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。本文将代码演示和文字描述详解拦截器的使用
    2022-04-04
  • Java根据模板实现excel导出标准化

    Java根据模板实现excel导出标准化

    这篇文章主要为大家详细介绍了Java如何根据模板实现excel导出标准化,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-03-03
  • 详解Java如何通过Socket实现查询IP

    详解Java如何通过Socket实现查询IP

    在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API,感兴趣的可以了解一下
    2022-10-10
  • mybatis-plus中更新null值的问题解决

    mybatis-plus中更新null值的问题解决

    本文主要介绍 mybatis-plus 中常使用的 update 相关方法的区别,以及更新 null 的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • Java实现快速并查集

    Java实现快速并查集

    这篇文章主要为大家详细介绍了Java实现快速并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 详解Java的Struts框架中上传文件和客户端验证的实现

    详解Java的Struts框架中上传文件和客户端验证的实现

    这篇文章主要介绍了Java的Struts框架中上传文件和客户端验证的实现,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • springmvc+shiro自定义过滤器的实现代码

    springmvc+shiro自定义过滤器的实现代码

    这篇文章主要介绍了springmvc+shiro自定义过滤器的实现方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • 基于spring注入为null的原因及解决方案

    基于spring注入为null的原因及解决方案

    这篇文章主要介绍了spring注入为null的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中接口和抽象类的区别与相同之处

    Java中接口和抽象类的区别与相同之处

    这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念、接口的概念、接口和抽象类的区别与联系等内容,需要的朋友可以参考下
    2015-06-06

最新评论