1. maven
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
或
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
2 . API
2.1 基础API
类 | 描述 | 方法 | 描述 |
---|---|---|---|
DefaultKaptcha | 默认验证码生成器 | createText() | 获取验证码文本 |
createImage(String text) | 生成验证码图片对象 | ||
setConfig(Config config) | 设置配置信息,无参获取配置信息 | ||
Config | 配置对象,方法都为get方法,获取各配置信息 | Config(Properties properties) | 构造方法,获取配置对象 |
2.2 配置常量(Constants)
常量 | 描述 | 默认 |
---|---|---|
KAPTCHA_SESSION_KEY | session key | KAPTCHA_SESSION_KEY |
KAPTCHA_SESSION_DATE | session date | KAPTCHA_SESSION_DATE |
KAPTCHA_SESSION_CONFIG_KEY | session key | KAPTCHA_SESSION_KEY |
KAPTCHA_SESSION_CONFIG_DATE | session date | KAPTCHA_SESSION_DATE |
KAPTCHA_BORDER | 是否有边框 默认为我们可以自己设置yes,no | true |
KAPTCHA_BORDER_COLOR | 边框颜色 | BLACK |
KAPTCHA_BORDER_THICKNESS | 边框厚度 | |
KAPTCHA_NOISE_COLOR | 干扰 颜色,合法值: r,g,b 或者 white,black,blue. | black |
KAPTCHA_NOISE_IMPL | 干扰实现类 | com.google.code.kaptcha.impl.DefaultNoise |
KAPTCHA_OBSCURIFICATOR_IMPL | 图片样式 | com.google.code.kaptcha.impl.WaterRipple |
KAPTCHA_PRODUCER_IMPL | 图片实现类 | com.google.code.kaptcha.impl.DefaultKaptcha |
KAPTCHA_TEXTPRODUCER_CHAR_STRING | 文本集合,验证码值从此集合中获取 | abcde2345678gfynmnpwx |
KAPTCHA_TEXTPRODUCER_CHAR_LENGTH | 验证码长度 | 5 |
KAPTCHA_TEXTPRODUCER_FONT_NAMES | 字体 | Arial, Courier |
KAPTCHA_TEXTPRODUCER_FONT_COLOR | 字体颜色,合法值: r,g,b 或者 white,black,blue. | black |
KAPTCHA_TEXTPRODUCER_FONT_SIZE | 字体大小 | 40px |
KAPTCHA_TEXTPRODUCER_CHAR_SPACE | 文字间隔 | 2 |
KAPTCHA_TEXTPRODUCER_IMPL | 文本实现类 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
KAPTCHA_BACKGROUND_IMPL | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
KAPTCHA_BACKGROUND_CLR_FROM | 背景颜色渐变,开始颜色 | light grey |
KAPTCHA_BACKGROUND_CLR_TO | 背景颜色渐变, 结束颜色 | white |
KAPTCHA_IMAGE_WIDTH | 验证码图片宽度 | 200 |
KAPTCHA_IMAGE_HEIGHT | 验证码图片高度 | 50 |
KAPTCHA_WORDRENDERER_IMPL |
一些内置配置类:
配置项 | 配置值 | 描述 |
---|---|---|
KAPTCHA_NOISE_IMPL | com.google.code.kaptcha.impl.DefaultNoise | 默认干扰线 |
com.google.code.kaptcha.impl.NoNoise | 无干扰线 | |
KAPTCHA_OBSCURIFICATOR_IMPL | com.google.code.kaptcha.impl.WaterRipple | 水纹 |
com.google.code.kaptcha.impl.FishEyeGimpy | 鱼眼 | |
com.google.code.kaptcha.impl.ShadowGimpy | 阴影 | |
KAPTCHA_PRODUCER_IMPL | com.google.code.kaptcha.impl.DefaultKaptcha | 默认图片实现类 |
KAPTCHA_BACKGROUND_IMPL | com.google.code.kaptcha.impl.DefaultBackground | 默认背景实现类 |
KAPTCHA_TEXTPRODUCER_IMPL | com.google.code.kaptcha.text.impl.DefaultTextCreator | 默认文本实现类 |
3. 示例
3.1 简单验证码生成
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
//todo 添加配置
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
String text = defaultKaptcha.createText();
BufferedImage image = defaultKaptcha.createImage(text);
//输出文本及图片
System.out.println(text);
ImageIO.write(image,"png",new File("D:\\demo\\kaptcha\\"+System.currentTimeMillis()+".png"));
3.2 四则运算文本实现类
package com.ruoyi.framework.config;
import java.security.SecureRandom;
import java.util.Random;
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
/**
* 验证码文本生成器
*/
public class KaptchaTextCreator extends DefaultTextCreator {
private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
@Override
public String getText() {
Integer result = 0;
Random random = new SecureRandom();
int x = random.nextInt(10);
int y = random.nextInt(10);
StringBuilder suChinese = new StringBuilder();
int randomoperands = (int) Math.round(Math.random() * 2);
if (randomoperands == 0) {
result = x * y;
suChinese.append(CNUMBERS[x]);
suChinese.append("*");
suChinese.append(CNUMBERS[y]);
} else if (randomoperands == 1) {
if (!(x == 0) && y % x == 0) {
result = y / x;
suChinese.append(CNUMBERS[y]);
suChinese.append("/");
suChinese.append(CNUMBERS[x]);
} else {
result = x + y;
suChinese.append(CNUMBERS[x]);
suChinese.append("+");
suChinese.append(CNUMBERS[y]);
}
} else if (randomoperands == 2) {
if (x >= y) {
result = x - y;
suChinese.append(CNUMBERS[x]);
suChinese.append("-");
suChinese.append(CNUMBERS[y]);
} else {
result = y - x;
suChinese.append(CNUMBERS[y]);
suChinese.append("-");
suChinese.append(CNUMBERS[x]);
}
} else {
result = x + y;
suChinese.append(CNUMBERS[x]);
suChinese.append("+");
suChinese.append(CNUMBERS[y]);
}
//TODO 获取文本用@分割,前者为验证码文本,后者为结果
suChinese.append("=?@" + result);
return suChinese.toString();
}
}
3.3 中文文本实现类
package com.example.project.demo;
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
import java.io.UnsupportedEncodingException;
import java.util.Random;
/**
* 验证码文本生成器 验证码字体应设置为中文字体
*/
public class ChineseTextCreator extends DefaultTextCreator {
@Override
public String getText() {
int length = getConfig().getTextProducerCharLength();
return getRandomJianHan(length);
}
/**
* 获取指定长度随机简体中文
*/
private String getRandomJianHan(int len) {
StringBuffer ret = new StringBuffer();
for (int i = 0; i < len; i++) {
String str = null;
int hightPos, lowPos; // 定义高低位
Random random = new Random();
hightPos = (176 + Math.abs(random.nextInt(39))); //获取高位值
lowPos = (161 + Math.abs(random.nextInt(93))); //获取低位值
byte[] b = new byte[2];
b[0] = (new Integer(hightPos).byteValue());
b[1] = (new Integer(lowPos).byteValue());
try {
str = new String(b, "GBk"); //转成中文
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
ret.append(str);
}
return ret.toString();
}
}