You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中创建多单词验证码(Captcha)?求替代工具或自定义方法

生成多短语验证码的Java方案

一、可选第三方库

  • Kaptcha:默认虽为单单词,但支持自定义TextProducer接口。实现该接口的getText()方法,返回从预设短语库中随机挑选的多单词组合(用空格分隔),再配合其内置的干扰线、字体扭曲等配置,就能生成符合需求的验证码。
  • SimpleCaptcha 扩展:SimpleCaptcha允许替换默认的文本生成逻辑,你可以继承默认TextProducer实现,改写生成逻辑返回多单词短语,再利用原有图片生成能力输出验证码。

二、自定义实现步骤

如果不想依赖第三方库,用Java原生Graphics2D就能手动实现:

  1. 准备短语库:创建包含多组多单词短语的列表,比如["hello world", "good morning", "java code"]。
  2. 随机选短语:从列表中随机抽取一条作为验证码文本。
  3. 创建画布:用BufferedImage创建指定宽高的图片,获取Graphics2D绘图对象。
  4. 添加干扰元素:填充背景色,绘制随机干扰线、噪点,提升验证码防识别能力。
  5. 绘制验证码文本:设置随机字体、颜色、轻微倾斜角度,将选中的短语绘制到画布(保留单词间空格)。
  6. 输出图片:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:10:34