Java使用Kaptcha實現(xiàn)簡單的驗證碼生成器
驗證碼生成器
依賴
<!-- 驗證碼 --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <exclusions> <exclusion> <artifactId>javax.servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency>
首先配置驗證碼
@Configuration public class CaptchaConfig { @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { // 驗證碼生成器 DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); // 創(chuàng)建資源類 Properties properties = new Properties(); // 是否有邊框 默認為true 我們可以自己設(shè)置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 驗證碼文本字符顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 驗證碼圖片寬度 默認為200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 驗證碼圖片高度 默認為50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 驗證碼文本字符大小 默認為40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY 指定保存驗證碼文本的 Session 屬性名 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 驗證碼文本字符長度 默認為5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 驗證碼文本字體樣式 默認為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; /** * 生成驗證碼 */ @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()); }
計算驗證碼
配置類
這里使用自定義的類
com.ec.auth.config.KaptchaTextCreator 這是包路徑
// 驗證碼文本生成器 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ec.auth.config.KaptchaTextCreator");
效果
實現(xiàn)類
import com.google.code.kaptcha.text.impl.DefaultTextCreator; import java.util.Random; /** * 驗證碼文本生成器 */ 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(); // 是否有邊框 默認為true 我們可以自己設(shè)置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 邊框顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); // 驗證碼文本字符顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); // 驗證碼圖片寬度 默認為200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 驗證碼圖片高度 默認為50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 驗證碼文本字符大小 默認為40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); // KAPTCHA_SESSION_KEY 指定保存驗證碼文本的 Session 屬性名 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); // 驗證碼文本生成器 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ec.auth.config.KaptchaTextCreator"); // 驗證碼文本字符間距 默認為2 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); // 驗證碼文本字符長度 默認為5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); // 驗證碼文本字體樣式 默認為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 驗證碼噪點顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); // 干擾實現(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實現(xiàn)簡單的驗證碼生成器的詳細內(nèi)容,更多關(guān)于Java Kaptcha驗證碼生成的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring cloud踩坑記錄之使用feignclient遠程調(diào)用服務(wù)404的方法
這篇文章主要給大家介紹了關(guān)于Spring cloud踩坑記錄之使用feignclient遠程調(diào)用服務(wù)404的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Spring Boot實現(xiàn)郵件發(fā)送必會的5種姿勢
這篇文章主要給大家介紹了關(guān)于Spring Boot實現(xiàn)郵件發(fā)送必會的5種姿勢,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02SpringBoot使用阿里OSS實現(xiàn)文件云存儲的方法
這篇文章主要介紹了SpringBoot使用阿里OSS實現(xiàn)文件云存儲,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Java元素排序Comparable與Comparator的區(qū)別
這篇文章主要介紹了Java元素排序Comparable與Comparator的區(qū)別,二者都是頂級的接口,但擁有的方法和用法是不同的,下面我們分別來看看具體是怎樣的區(qū)別吧2022-05-05SpringBoot集成Redisson實現(xiàn)分布式鎖的方法示例
這篇文章主要介紹了SpringBoot集成Redisson實現(xiàn)分布式鎖的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10