当前位置: 首页 > 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

相关文章:

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

SpringBoot集成easy-captcha图片验证码框架 此项目已经很久未维护&#xff0c;如有更好的选择&#xff0c;建议使用更好的选择!!! 一、引言 验证码&#xff08;CAPTCHA&#xff09;是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而&#xff0c;从零开发验证码…...

Apache Flink:实时数据流处理的终极武器

Apache Flink&#xff1a;实时数据流处理的终极武器 在当今这个数据驱动的世界&#xff0c;实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐&#xff0c;从物联网监控到网络安全&#xff0c;毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...

货车一键启动无钥匙进入手机远程启动的正确使用方法

一、移动管家货车无钥匙进入系统的使用方法 基本原理&#xff1a;无钥匙进入系统通常采用RFID无线射频技术和车辆身份识别码识别系统。车钥匙需要随身携带&#xff0c;当车钥匙靠近货车时&#xff0c;它会自动与货车的解码器匹配。开门操作&#xff1a;当靠近货车后&#xff0…...

C# Enumerable类 之 生成序列

总目录 前言 在 C# 中&#xff0c;System.Linq.Enumerable 类是 LINQ&#xff08;Language Integrated Query&#xff09;的核心组成部分&#xff0c;它提供了一系列静态方法&#xff0c;用于操作实现了 IEnumerable 接口的集合。通过这些方法&#xff0c;我们可以轻松地对集合…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器&#xff08;Analyzer&#xff09;1. 倒排索引&#xff1a;搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比&#xff1a; 1.2 倒排索引核心结…...

salesforce 为什么无法关闭task,显示:insufficient access rights on object id

在 Salesforce 中&#xff0c;如果你在尝试关闭任务&#xff08;Task&#xff09;时遇到 “Insufficient access rights on object id” 错误&#xff0c;通常是由于以下几种可能的权限问题导致的&#xff1a; 1. 任务的所有权问题 Salesforce 中的任务&#xff08;Task&…...

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连&#xff0c;发挥着不可替代的重要作用。人工智能技术的迅猛发展&#xff0c;为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息&#xff0c;助力人类更精准地把握自然规律&am…...

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…...

工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】

随着增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助&#xff0c;还极大地提升了远程协助的效率、优化了仓储管理。新立电子其高性能的FPC产品在AI眼镜中的应用&#xff0c…...

Metal学习笔记八:纹理

到目前为止&#xff0c;您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理&#xff0c;您将在本章中学习如何作。更具体地说&#xff0c;您将了解&#xff1a; • UV 坐标&#xff1a;如何展开网格&#xff0c;以便可以对其应用纹理。 • 纹…...

一文5分钟掌握基于JWT的模拟登录爬取实战

文章目录 一、JWT简介1.1 什么是JWT&#xff1f;1.2 JWT的结构1.3 模拟登录流程1.4 爬取数据1.5 实战步骤 二、实战示例&#xff1a;基于JWT的模拟登录爬取2.1 环境准备2.2 分析登录流程2.3 编写模拟登录代码2.4 代码说明 三、处理复杂情况3.1 动态参数3.2 多因素认证3.3 刷新T…...

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支&#xff0c;如 “Git:master” 3. 有了 4....

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…...

HAL库 IIC写和读函数

IIC写函数&#xff1a;HAL_I2C_Master_Transmit (); IIC读函数&#xff1a;HAL_I2C_Master_Receive ()&#xff1b;写和读函数中的从机的地址最后一位由外部硬件电路控制。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------…...

初识flutter1

为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具&#xff1a; 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…...

12字符函数

一、函数strchr与strrchr 注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解&#xff1a; 示例代码&#xff…...

QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发

Github Copilot是Github和OpenAI推出的AI编程辅助工具&#xff0c;之前版本的Github Copilot只有简单的代码自动补全&#xff0c;根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级&#xff0c;加入了Agent模式&#xff0c;可以实现自然语言对话讨论和最重要的&a…...

矩阵的奇异值(SVD)分解和线性变换

矩阵的奇异值&#xff08;SVD&#xff09;分解和线性变换 SVD定义 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称 SVD&#xff09;是一种重要的线性代数工具&#xff0c;能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_rbtree_sentinel_init

ngx_rbtree_sentinel_init 定义在 src\core\ngx_rbtree.h #define ngx_rbt_black(node) ((node)->color 0) /* a sentinel must be black */#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)初始化哨兵节点的颜色 将哨兵节点&#xff08;node&a…...

数据库的sql语句

本篇文章主要用来收集项目开发中&#xff0c;遇到的各种sql语句的编写。 1、根据user表的role_id字段&#xff0c;查询role表。 sql语句&#xff1a;使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...

Bugku CTF Crypto(二)

目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官&#xff08;宫&#xff09; 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析&#xff1a;题目提示这不是md5&#xff0c;字符中出现了d&#xff0c;猜测16进制 使用…...

openssl的aes128_ECB加密解密运算实例

aes128算法ECB接口 加密接口 注意事项&#xff1a; EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb()&#xff0c;和密钥&#xff0c;key至少16BEVP_EncryptUpdate加密运算&#xff0c;tmplen输出已加密长度EVP_EncryptFinal_ex结束运算&#xff0c;如果在此仍有加密运算&…...

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…...

动态部署Web应用程序与web.xml配置详解

文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署&#xff1f;1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml&#xff1f;2.2 web.xml 文件的结构2.2.1常见配置&#xff08;1&#xff09; 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...

Rt-thread源码剖析(1)——内核对象

前言 该系列基于rtthread-nano的内核源码&#xff0c;来研究RTOS的底层逻辑&#xff0c;本文介绍RTT的内核对象&#xff0c;对于其他RTOS来说也可供参考&#xff0c;万变不离其宗&#xff0c;大家都是互相借鉴&#xff0c;实现不会差太多。 内核对象容器 首先要明确的一点是什…...

Python 的历史进程

Python&#xff1a;编程世界中的瑞士军刀 在当今数字化飞速发展的时代&#xff0c;编程语言层出不穷&#xff0c;而 Python 无疑是其中一颗耀眼的明珠。它以其简洁优雅的语法、强大的功能以及广泛的应用领域&#xff0c;成为了全球开发者炙手可热的编程语言之一。 Python 是一种…...

十一、大数据治理平台总体功能架构

大数据治理平台的功能架构图中心主题&#xff1a;数据治理 核心重点是建立健全大数据资产管理框架&#xff0c;确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台&#xff08;左侧&#xff09; 此部分主要关注数据资产本身…...

STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)

定时器有四个通道&#xff0c;这些通道既可以用来作为输入&#xff0c;又可以作为输出。做输入的时候&#xff0c;可以使用定时器对外部输入的信号的时间参数进行测量&#xff1b;做输出的时候&#xff0c;可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…...

爬虫反爬:CSS位置偏移反爬案例分析与实战案例

文章目录 1. 反爬机制概述2. 反爬原理3. 案例分析4. 破解思路5. 实战样例样例1&#xff1a;使用Python和Selenium破解CSS位置偏移反爬样例2&#xff1a;电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术&#xff0c;通过C…...