Java使用Kaptcha實(shí)現(xiàn)簡單的驗(yàn)證碼生成器
驗(yàn)證碼生成器
依賴
<!-- 驗(yàn)證碼 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<exclusions>
<exclusion>
<artifactId>javax.servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>

首先配置驗(yàn)證碼
@Configuration
public class CaptchaConfig {
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean() {
// 驗(yàn)證碼生成器
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
// 創(chuàng)建資源類
Properties properties = new Properties();
// 是否有邊框 默認(rèn)為true 我們可以自己設(shè)置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 驗(yàn)證碼文本字符顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 驗(yàn)證碼圖片寬度 默認(rèn)為200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 驗(yàn)證碼圖片高度 默認(rèn)為50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 驗(yàn)證碼文本字符大小 默認(rèn)為40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
// KAPTCHA_SESSION_KEY 指定保存驗(yàn)證碼文本的 Session 屬性名
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
// 驗(yàn)證碼文本字符長度 默認(rèn)為5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 驗(yàn)證碼文本字體樣式 默認(rèn)為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 圖片樣式 水紋com.google.code.kaptcha.impl.WaterRipple 魚眼com.google.code.kaptcha.impl.FishEyeGimpy 陰影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
// 創(chuàng)建配置
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
使用
@Resource(name = "captchaProducer")
private Producer captchaProducer;
/**
* 生成驗(yàn)證碼
*/
@GetMapping("/captchaImage")
public String getCode(HttpServletResponse response) throws IOException {
// 這是文本
String capStr = captchaProducer.createText();
// 這是圖像
BufferedImage image = captchaProducer.createImage(capStr);
// 轉(zhuǎn)換流信息寫出
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
ImageIO.write(image, "jpg", os);
return Base64.encode(os.toByteArray());
}
計(jì)算驗(yàn)證碼
配置類
這里使用自定義的類
com.ec.auth.config.KaptchaTextCreator 這是包路徑
// 驗(yàn)證碼文本生成器 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ec.auth.config.KaptchaTextCreator");
效果

實(shí)現(xiàn)類
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
import java.util.Random;
/**
* 驗(yàn)證碼文本生成器
*/
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;
Random random = new Random();
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]);
}
suChinese.append("=?@").append(result);
return suChinese.toString();
}
}@Bean(name = "captchaProducerMath")
public DefaultKaptcha getKaptchaBeanMath() {
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有邊框 默認(rèn)為true 我們可以自己設(shè)置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 邊框顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
// 驗(yàn)證碼文本字符顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
// 驗(yàn)證碼圖片寬度 默認(rèn)為200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 驗(yàn)證碼圖片高度 默認(rèn)為50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 驗(yàn)證碼文本字符大小 默認(rèn)為40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
// KAPTCHA_SESSION_KEY 指定保存驗(yàn)證碼文本的 Session 屬性名
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
// 驗(yàn)證碼文本生成器
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ec.auth.config.KaptchaTextCreator");
// 驗(yàn)證碼文本字符間距 默認(rèn)為2
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
// 驗(yàn)證碼文本字符長度 默認(rèn)為5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
// 驗(yàn)證碼文本字體樣式 默認(rèn)為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 驗(yàn)證碼噪點(diǎn)顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
// 干擾實(shí)現(xiàn)類
properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
// 圖片樣式 水紋com.google.code.kaptcha.impl.WaterRipple 魚眼com.google.code.kaptcha.impl.FishEyeGimpy 陰影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
前端
<div class="login-code">
<img :src="codeUrl" class="login-code-img" @click="getCode" alt=""/>
</div>
const getCode = async () => {
const {img, uuid} = await getCodeImg()
if (captchaOnOff.value) {
codeUrl.value = 'data:image/gif;base64,' + img
}
}
以上就是Java使用Kaptcha實(shí)現(xiàn)簡單的驗(yàn)證碼生成器的詳細(xì)內(nèi)容,更多關(guān)于Java Kaptcha驗(yàn)證碼生成的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring cloud踩坑記錄之使用feignclient遠(yuǎn)程調(diào)用服務(wù)404的方法
這篇文章主要給大家介紹了關(guān)于Spring cloud踩坑記錄之使用feignclient遠(yuǎn)程調(diào)用服務(wù)404的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Spring Boot實(shí)現(xiàn)郵件發(fā)送必會(huì)的5種姿勢(shì)
這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件發(fā)送必會(huì)的5種姿勢(shì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Java回調(diào)函數(shù)原理實(shí)例與代理模式的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實(shí)例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
springboot自動(dòng)配置沒有生效的問題定位(條件斷點(diǎn))
這篇文章主要介紹了springboot自動(dòng)配置未生效問題定位,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來學(xué)習(xí)一下吧2019-06-06
SpringCache緩存自定義配置的實(shí)現(xiàn)
本文主要介紹了SpringCache緩存自定義配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
SpringBoot使用阿里OSS實(shí)現(xiàn)文件云存儲(chǔ)的方法
這篇文章主要介紹了SpringBoot使用阿里OSS實(shí)現(xiàn)文件云存儲(chǔ),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java元素排序Comparable與Comparator的區(qū)別
這篇文章主要介紹了Java元素排序Comparable與Comparator的區(qū)別,二者都是頂級(jí)的接口,但擁有的方法和用法是不同的,下面我們分別來看看具體是怎樣的區(qū)別吧2022-05-05
SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例
這篇文章主要介紹了SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

