今天苏米要分享的这个独立开发者作品,非常值得学习。对我们做站点、做后端的同学来说,验证码是“成本小、收益大”的一环:拦住恶意请求、减轻服务器压力、保护用户数据。
而这款工具的亮点在于——上手几乎零门槛,1 行代码就能跑起来,细节也做得很到位。
简介
Happy-Captcha 是一款基于 Java 实现的免费开源验证码工具,目标很简单:用最少的代码,搞定最丰富的验证码形态。
它支持“图片”和“动画”两种呈现方式,内置多种内容类型(数字、字母、汉字、算术表达式等),并提供丰富的 API,方便自定义样式、尺寸、字体等参数,覆盖后端常见业务场景。

- 呈现方式:图片、动画两种
- 自定义项:验证码内容类型、长度、宽高、字体等
- 使用门槛:仅需提供 request/response 即可输出验证码
苏米的使用体验:默认参数已满足大多数业务,一行链式调用就能输出“还挺好看”的验证码图片;要做细节定制,也有足够钩子。
验证码形式
内容类型非常全,覆盖 12 种常见组合:
- 中文(收录 3500 常用汉字)
- 阿拉伯数字(0~9)
- 中文数字(零至九,简体)
- 中文大写数字(零至玖,繁体)
- 数字与字母混合(0~9 + a~z + A~Z)
- 数字 + 小写字母混合
- 数字 + 大写字母混合
- 纯小写字母
- 纯大写字母
- 大小写字母混合
- 算术表达式(阿拉伯数字表达式)
- 算术表达式(中文表达式)
对应枚举值(供代码里使用):
- DEFAULT:数字、大小写字母随机组合
- ARITHMETIC:加、减、乘算术表达式
- ARITHMETIC_ZH:中文简体加、减、乘算术表达式
- CHINESE:常见汉字随机组合
- NUMBER:0~9 数字随机组合
- NUMBER_ZH_CN:中文数字(零至九)
- NUMBER_ZH_HK:中文繁体数字(零至玖)
- WORD:大小写字母随机组合
- WORD_LOWER:小写字母随机组合
- WORD_UPPER:大写字母随机组合
- WORD_NUMBER_LOWER:数字 + 小写字母
- WORD_NUMBER_UPPER:数字 + 大写字母
呈现风格(由 CaptchaStyle 提供):IMG(图片)、ANIM(动画)。
苏米建议:管理后台、频繁刷新场景可优先用 ARITHMETIC/ARITHMETIC_ZH,识别成本更低;对抗脚本建议 DEFAULT/混合字母数字并调高长度。
快速应用
1、引入依赖
com.ramostear
Happy-Captcha
1.0.1
放在 Web 模块即可使用,兼容 Spring MVC/Spring Boot。
生产环境建议锁定版本,避免未测试的升级带来兼容问题。
2、生成验证码
只需 request 和 response 两个参数,其余都可用默认值:图片、字符集为 0~9、a~z、A~Z,长度 5,尺寸 160×50,字体为微软雅黑。
@Controller
public class HappyCaptchaController{
@GetMapping("/captcha")
public void happyCaptcha(HttpServletRequest request,HttpServletResponse response){
HappyCaptcha.require(request,response).build().finish();
}
}
注意:为避免浏览器或 CDN 缓存,建议在过滤器/拦截器里给该接口加上 no-cache 响应头。
如果前后端分离,前端拿到图片流或 img src 指向 /captcha 即可。
3、校验
第三个参数表示是否忽略大小写:true 忽略,false 严格匹配。
@Controller
public class CaptchaController{
@PostMapping("/verify")
public String verify(String code,HttpServletRequest request){
boolean flag = HappyCaptcha.verification(request,code,true);
if(flag){
//Other operations...
}
return flag ? "ok" : "fail";
}
}
- 配合表单/接口调用时,建议增加基础限流:同 IP 连续失败 N 次后短暂封禁,防止撞库。
- 用户通过后请尽快清理验证码,避免重复使用。
4、清理
验证码使用后可通过 remove() 清理(Session Key 为 "happy-captcha")。
@Controller
public class HappyCaptchaController{
@GetMapping("/remove/captcha")
public void removeCaptcha(HttpServletRequest request){
HappyCaptcha.remove(request);
}
}
也可在登录成功、验证码验证通过后手动移除 Session 中的 "happy-captcha"。
建议配合 Session 过期时间,避免验证码长期驻留。
高级特性
style():切换图片或动画(默认图片)。
HappyCaptcha.require(request,response)
.style(CaptchaStyle.ANIM)
.build().finish();
- 动画样式更“活”,对简单脚本更友好,但体积稍大,页面要预留尺寸。
type():选择内容类型(共 12 种)。默认数字 + 大小写字母混合。
HappyCaptcha.require(request,response)
.type(CaptchaType.CHINESE)
.build().finish();
- 面向中文用户的表单,可尝试 CHINESE 或中文算术,既友好又不容易被暴力枚举。
length():设置字符长度(默认 5)。
HappyCaptcha.require(request,response)
.length(6)
.build().finish();
- 一般业务 4~6 位即可;风控较严的接口可考虑 6~8 位。
width():设置图片宽度(默认 160)。
HappyCaptcha.require(request,response)
.width(180)
.build().finish();
height():设置图片高度(默认 50)。
HappyCaptcha.require(request,response)
.height(60)
.build().finish();
font():设置字体(默认微软雅黑)。内置字体可通过 Fonts 类获取。
HappyCaptcha.require(request,response)
.font(Fonts.getInstance().zhFont())
.build().finish();
中文类验证码建议选择更清晰的中文字体,避免笔画密集导致识别困难。
链式调用:一次性配置多个属性。
@GetMapping("/captcha")
public void captcha(HttpServletRequest req,HttpServletResponse res){
HappyCaptcha.require(req,res)
.style(CaptchaStyle.ANIM) // 动画
.type(CaptchaType.CHINESE) // 汉字
.length(6) // 6 位
.width(220) // 宽 220
.height(80) // 高 80
.font(Fonts.getInstance().zhFont()) // 字体
.build().finish(); // 输出
}
实战建议:对接登录/注册时,前端应提供“看不清?换一张”按钮,后端支持多次拉取;同时返回错误时提示“验证码不正确”,避免泄露校验规则细节。