如何在Java中创建多单词验证码(Captcha)?求替代工具或自定义方法
生成多短语验证码的Java方案
一、可选第三方库
- Kaptcha:默认虽为单单词,但支持自定义
TextProducer接口。实现该接口的getText()方法,返回从预设短语库中随机挑选的多单词组合(用空格分隔),再配合其内置的干扰线、字体扭曲等配置,就能生成符合需求的验证码。 - SimpleCaptcha 扩展:SimpleCaptcha允许替换默认的文本生成逻辑,你可以继承默认
TextProducer实现,改写生成逻辑返回多单词短语,再利用原有图片生成能力输出验证码。
二、自定义实现步骤
如果不想依赖第三方库,用Java原生Graphics2D就能手动实现:
- 准备短语库:创建包含多组多单词短语的列表,比如
["hello world", "good morning", "java code"]。 - 随机选短语:从列表中随机抽取一条作为验证码文本。
- 创建画布:用
BufferedImage创建指定宽高的图片,获取Graphics2D绘图对象。 - 添加干扰元素:填充背景色,绘制随机干扰线、噪点,提升验证码防识别能力。
- 绘制验证码文本:设置随机字体、颜色、轻微倾斜角度,将选中的短语绘制到画布(保留单词间空格)。
- 输出图片:将
BufferedImage转为文件或流输出。
简单代码示例
import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; import javax.imageio.ImageIO; import java.io.FileOutputStream; public class MultiWordCaptcha { private static final String[] PHRASES = {"hello world", "good morning", "java code", "test captcha"}; private static final Random RANDOM = new Random(); public static void main(String[] args) throws Exception { int width = 300; int height = 100; // 创建画布 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); // 填充背景 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); // 添加干扰线 g2d.setColor(Color.LIGHT_GRAY); for (int i = 0; i < 10; i++) { int x1 = RANDOM.nextInt(width); int y1 = RANDOM.nextInt(height); int x2 = RANDOM.nextInt(width); int y2 = RANDOM.nextInt(height); g2d.drawLine(x1, y1, x2, y2); } // 随机选择短语 String captchaText = PHRASES[RANDOM.nextInt(PHRASES.length)]; // 设置字体 g2d.setFont(new Font("Arial", Font.BOLD, 30)); // 设置文本颜色 g2d.setColor(new Color(RANDOM.nextInt(100), RANDOM.nextInt(100), RANDOM.nextInt(100))); // 计算文本居中位置 FontMetrics metrics = g2d.getFontMetrics(); int x = (width - metrics.stringWidth(captchaText)) / 2; int y = (height - metrics.getHeight()) / 2 + metrics.getAscent(); // 添加轻微倾斜效果 g2d.shear(0.1f, 0.05f); g2d.drawString(captchaText, x, y); g2d.dispose(); // 输出到文件 ImageIO.write(image, "PNG", new FileOutputStream("multi_word_captcha.png")); } }
三、注意事项
- 确保短语长度适配图片尺寸,避免文本超出画布范围。
- 可增加文本旋转、扭曲程度,进一步提升验证码安全性。
- 干扰元素数量和样式要适度,兼顾机器识别难度与用户可读性。
内容的提问来源于stack exchange,提问作者dani izquierdo
相关产品推荐
相关产品推荐

