01 引言
在互联网应用快速发展的今天,图片验证码作为区分人类用户与自动化程序的核心安全机制,被广泛应用于登录、注册等高敏感场景。
基于Java的图片验证码功能通过动态生成包含随机字符的干扰图像,可有效防御恶意爬虫、暴力破解等自动化攻击。其实现通常结合图像处理技术与随机算法,通过扭曲变形、噪点干扰及复杂背景设计提升破解难度。然而,验证码设计需兼顾安全性与用户体验,避免过度复杂化导致用户识别困难。
本文将介绍一种最简单的开源的图形验证框架,欢迎白嫖。
02 Kaptcha
Kaptcha
是大厂Google
出品,被广大程序员喜爱。
2.1 依赖引入
xml
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
2.2 配置验证码工具类
java
public class KaptchaUtil {
private KaptchaUtil () {}
private static final DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
static {
Properties properties = new Properties();
// 设置验证码的长度
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
// 验证码图片宽度
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "120");
// 验证码图片高度
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "50");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
}
public static DefaultKaptcha getInstance() {
return defaultKaptcha;
}
}
这里必须要配置Config
,可以使用默认的配置,直接传入空的Properties
对象即可。
2.3 图片验证码高级配置
默认的配置已经可以满足我们对验证码的要求。如果默认的验证码不满足我们的要求,我们还可以自定义配置,通过Properties
来处理。
可以配置的属性:com.google.code.kaptcha.Constants
配置名 | 配置作用 | 默认值 |
---|---|---|
kaptcha.border | 是否有边框 | yes |
kaptcha.border.color | 边框颜色 | black |
kaptcha.border.thickness | 边框粗细 | 1 |
kaptcha.image.width | 图片宽度 | 200 |
kaptcha.image.height | 图片高度 | 50 |
kaptcha.producer.impl | 图片实现类 | com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl | 文本实现类 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string | 文本集合,验证码值从此集合中获取 | abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length | 验证码长度 | 5 |
kaptcha.textproducer.font.names | 字体 | Arial, Courier |
kaptcha.textproducer.font.size | 字体大小 | 40px |
kaptcha.textproducer.font.color | 字体颜色 | black |
kaptcha.textproducer.char.space | 文字间隔 | 2 |
kaptcha.noise.impl | 干扰实现类 | com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color | 干扰颜色 | black |
kaptcha.obscurificator.impl | 图片样式 | com.google.code.kaptcha.impl.WaterRipple |
kaptcha.background.impl | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from | 背景颜色渐变,开始颜色 | light grey |
kaptcha.background.clear.to | 背景颜色渐变,结束颜色 | white |
kaptcha.word.impl | 文字渲染器 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.session.key | 存储在session中的key | KAPTCHA_SESSION_KEY |
kaptcha.session.date | 存储在session中的日期 | KAPTCHA_SESSION_DATE |
kaptcha.noise.impl | 噪点实现类 | com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color | 噪点颜色 | black |
kaptcha.obscurificator.impl | 图片样式 | com.google.code.kaptcha.impl.WaterRipple |
kaptcha.producer.impl | 图片生成器 | com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl | 文本生成器 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string | 文本集合 | abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length | 验证码长度 | 5 |
kaptcha.word.impl | 文字渲染器 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.background.impl | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from | 背景渐变开始颜色 | light grey |
kaptcha.background.clear.to | 背景渐变结束颜色 | white |
kaptcha.image.width | 图片宽度 | 200 |
kaptcha.image.height | 图片高度 | 50 |
kaptcha.gibberish.impl | 随机字符实现类 | com.google.code.kaptcha.text.impl.DefaultGibberish |
kaptcha.wordrenderer.impl | 文字渲染器实现类 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
以impl
结尾的属性,用户可以自动实现,订制属于自己的实现。其他的数据可以直接修改数据不需要额外的代码。
2.4 测试
默认图形验证码

定制图形验证码
java
// 验证码只能是数字
properties.setProperty("kaptcha.textproducer.char.string", "0123456789");
// 设置渐变色 从gray(灰色)到 yellow(黄色)
properties.setProperty("kaptcha.background.clear.from", "gray");
properties.setProperty("kaptcha.background.clear.to", "yellow");

03 小结
图片验证码最早期的验证策略。还依稀记得当年手搓图片验证码,现在已经完全忘记了。
随着技术的发展,这类图片验证码已经慢慢被滑动验证码、旋转验证码等替代,因为他们验证起来更方便且安全。
还记得当前铁道部12306
的验证码曾经引起一时轰动,铁道部为了应对黄牛党刷票,更是频繁的更换验证码的形式。当年的验证码6个杯子里装着透明液体,让用户找出是水的图片,不知道是真是假,一直被广大网友调侃。
下一期给大家带来另一款开源验证码:行为验证码。可以滑动、旋转、文字点选、刮刮乐等有趣的行为操作。
下期见!