最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用Kaptcha實(shí)現(xiàn)簡單的驗(yàn)證碼生成器

 更新時(shí)間:2024年02月03日 08:22:53   作者:哪里的破水瓶  
這篇文章主要為大家詳細(xì)介紹了Java如何使用Kaptcha實(shí)現(xiàn)簡單的驗(yàn)證碼生成器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下

驗(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)文章

  • 利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并

    利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并

    Jackson的功能豐富,安全可靠并且具有比較好的兼容性,這讓程序開發(fā)人員可以很方便地實(shí)現(xiàn)JSON 數(shù)據(jù)的相互轉(zhuǎn)換,下面小編就來和大家介紹一下如何利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并吧
    2025-03-03
  • Javassist用法詳解

    Javassist用法詳解

    這篇文章主要介紹了Javassist用法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Java多線程Atomic包操作原子變量與原子類詳解

    Java多線程Atomic包操作原子變量與原子類詳解

    這篇文章主要介紹了Java多線程Atomic包操作原子變量與原子類詳解,簡單介紹了Atomic,同時(shí)涉及java.util.concurrent中的原子變量,Atomic類的作用等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java獲取代碼中方法參數(shù)名信息的方法

    Java獲取代碼中方法參數(shù)名信息的方法

    在java中,可以通過反射獲取到類、字段、方法簽名等相關(guān)的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實(shí)際開發(fā)場景中,有時(shí)需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作了呢?下面就通過這篇文章來學(xué)習(xí)學(xué)習(xí)吧。
    2016-09-09
  • 關(guān)于注解式的分布式Elasticsearch的封裝案例

    關(guān)于注解式的分布式Elasticsearch的封裝案例

    這篇文章主要介紹了關(guān)于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    這篇文章主要介紹了一個(gè)簡單的Java學(xué)生信息管理系統(tǒng),使用ArrayList集合存儲(chǔ)學(xué)生對(duì)象信息,并實(shí)現(xiàn)了添加、刪除、修改和查看學(xué)生信息的功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • IDEA實(shí)現(xiàn)一鍵部署項(xiàng)目到服務(wù)器過程

    IDEA實(shí)現(xiàn)一鍵部署項(xiàng)目到服務(wù)器過程

    本文介紹了在阿里云服務(wù)器上通過開放2375端口、配置Docker及IDEA插件,實(shí)現(xiàn)項(xiàng)目打包、編寫Dockerfile、構(gòu)建鏡像和容器,并最終通過瀏覽器訪問部署服務(wù)的全過程
    2025-10-10
  • Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    這篇文章主要為大家介紹了Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Spring Boot 2.7.8 集成 Thymeleaf的最佳實(shí)踐與常見問題討論

    Spring Boot 2.7.8 集成 Thymeleaf的最佳實(shí)踐與常見問題

    本文詳細(xì)介紹了如何將SpringBoot2.7.8與Thymeleaf集成,從項(xiàng)目依賴到配置文件設(shè)置,再到控制器和模板的創(chuàng)建,以及如何解決常見的集成問題,通過實(shí)際案例,讀者可以快速掌握SpringBoot和Thymeleaf的協(xié)同工作,并解決開發(fā)過程中遇到的問題,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java基礎(chǔ)學(xué)習(xí)之ArrayList類概述與常用方法

    Java基礎(chǔ)學(xué)習(xí)之ArrayList類概述與常用方法

    這篇文章主要為大家簡單的介紹Java中ArrayList類的概述、常用方法及存儲(chǔ)字符串并遍歷,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08

最新評(píng)論

沙洋县| 大丰市| 乐业县| 福安市| 屏山县| 邛崃市| 富宁县| 雷州市| 广州市| 新乡市| 太和县| 乾安县| 承德市| 浙江省| 东宁县| 双江| 特克斯县| 应用必备| 晴隆县| 云安县| 巩义市| 鸡东县| 库伦旗| 沅陵县| 靖宇县| 英山县| 青海省| 平果县| 巴楚县| 页游| 顺昌县| 民乐县| 普安县| 英吉沙县| 伊春市| 平度市| 漳平市| 平江县| 天峨县| 琼结县| 基隆市|