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

java使用Hutool工具庫(kù)實(shí)現(xiàn)圖形驗(yàn)證碼

 更新時(shí)間:2026年05月23日 13:47:07   作者:新綠MEHO  
本文介紹了java使用Hutool工具庫(kù)實(shí)現(xiàn)圖形驗(yàn)證碼的方法,線段干擾驗(yàn)證碼、圓圈干擾驗(yàn)證碼和擾亂干擾驗(yàn)證碼,通過(guò)Hutool簡(jiǎn)化了驗(yàn)證碼的生成與驗(yàn)證過(guò)程,提升了開(kāi)發(fā)效率,文章詳細(xì)描述了線段干擾驗(yàn)證碼的登錄驗(yàn)證步驟,并提供了前端和后端代碼示例

下面將使用Hutool工具庫(kù)來(lái)輔助完成驗(yàn)證碼的實(shí)現(xiàn)。

關(guān)于Hutool的介紹

Hutool是一個(gè)小而全的Java工具類庫(kù),通過(guò)靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語(yǔ)言般的優(yōu)雅,讓Java語(yǔ)言也可以“甜甜的”。

Hutool中的工具方法來(lái)自每個(gè)用戶的精雕細(xì)琢,它涵蓋了Java開(kāi)發(fā)底層代碼中的方方面面,它既是大型項(xiàng)目開(kāi)發(fā)中解決小問(wèn)題的利器,也是小型項(xiàng)目中的效率擔(dān)當(dāng);

Hutool是項(xiàng)目中“util”包友好的替代,它節(jié)省了開(kāi)發(fā)人員對(duì)項(xiàng)目中公用類和公用工具方法的封裝時(shí)間,使開(kāi)發(fā)專注于業(yè)務(wù),同時(shí)可以最大限度的避免封裝不完善帶來(lái)的bug。

引入依賴

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.26</version>
</dependency>

圖形驗(yàn)證碼

介紹

驗(yàn)證碼功能位于cn.hutool.captcha包中,核心接口為ICaptcha,此接口定義了以下方法:

createCode 創(chuàng)建驗(yàn)證碼,實(shí)現(xiàn)類需同時(shí)生成隨機(jī)驗(yàn)證碼字符串和驗(yàn)證碼圖片
getCode 獲取驗(yàn)證碼的文字內(nèi)容
verify 驗(yàn)證驗(yàn)證碼是否正確,建議忽略大小寫(xiě)
write 將驗(yàn)證碼圖片寫(xiě)出到目標(biāo)流中

其中write方法只有一個(gè)OutputStream,ICaptcha實(shí)現(xiàn)類可以根據(jù)這個(gè)方法封裝寫(xiě)出到文件等方法。

AbstractCaptcha為一個(gè)ICaptcha抽象實(shí)現(xiàn)類,此類實(shí)現(xiàn)了驗(yàn)證碼文本生成、非大小寫(xiě)敏感的驗(yàn)證、寫(xiě)出到流和文件等方法,通過(guò)繼承此抽象類只需實(shí)現(xiàn)createImage方法定義圖形生成規(guī)則即可。

LineCaptcha實(shí)現(xiàn)線段干擾的驗(yàn)證碼

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;

public class DemoController {
    public static void main(String[] args) {
        //定義圖形驗(yàn)證碼的長(zhǎng)和寬
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);


        //圖形驗(yàn)證碼寫(xiě)出,可以寫(xiě)出到文件,也可以寫(xiě)出到流
        lineCaptcha.write("d:/line.png");
        //輸出code
        Console.log(lineCaptcha.getCode());
        //驗(yàn)證圖形驗(yàn)證碼的有效性,返回boolean值
        lineCaptcha.verify("1234");

        //重新生成驗(yàn)證碼
        lineCaptcha.createCode();
        lineCaptcha.write("d:/line.png");
        //新的驗(yàn)證碼
        Console.log(lineCaptcha.getCode());
        //驗(yàn)證圖形驗(yàn)證碼的有效性,返回boolean值
        lineCaptcha.verify("1234");
    }
}

運(yùn)行結(jié)果:

得到的圖形驗(yàn)證碼:

CircleCaptcha實(shí)現(xiàn)圓圈干擾驗(yàn)證碼

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.core.lang.Console;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CircleController {
    public static void main(String[] args) {
        //定義圖形驗(yàn)證碼的長(zhǎng)、寬、驗(yàn)證碼字符數(shù)、干擾元素個(gè)數(shù)
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
        //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
        //圖形驗(yàn)證碼寫(xiě)出,可以寫(xiě)出到文件,也可以寫(xiě)出到流
        captcha.write("d:/circle.png");
        Console.log(captcha.getCode());
        //驗(yàn)證圖形驗(yàn)證碼的有效性,返回boolean值
        captcha.verify("1234");
    }
}

運(yùn)行結(jié)果:

得到的圖形驗(yàn)證碼:

ShearCaptcha實(shí)現(xiàn)擾亂干擾驗(yàn)證碼

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import cn.hutool.core.lang.Console;

public class ShearController {
    public static void main(String[] args) {
        //定義圖形驗(yàn)證碼的長(zhǎng)、寬、驗(yàn)證碼字符數(shù)、干擾線寬度
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
        //ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
        //圖形驗(yàn)證碼寫(xiě)出,可以寫(xiě)出到文件,也可以寫(xiě)出到流
        captcha.write("d:/shear.png");
        Console.log(captcha.getCode());
        //驗(yàn)證圖形驗(yàn)證碼的有效性,返回boolean值
        captcha.verify("1234");
    }
}

運(yùn)行結(jié)果:

得到的圖形驗(yàn)證碼:

線段干擾驗(yàn)證碼實(shí)現(xiàn)登錄驗(yàn)證

線段干擾驗(yàn)證碼實(shí)現(xiàn)登錄驗(yàn)證步驟詳解:

1.圖形驗(yàn)證碼登錄分為前端和后端;

2.前端首先會(huì)向后端發(fā)起請(qǐng)求獲取圖形驗(yàn)證碼;

3.后端接收到前端發(fā)送的獲取圖形驗(yàn)證碼請(qǐng)求后,生成圖形驗(yàn)證碼并響應(yīng)給前端;

4.于此同時(shí),后端將剛剛生成的圖形驗(yàn)證碼的值存放到session里面,包括當(dāng)時(shí)的時(shí)間;

5.然后用戶在前端頁(yè)面輸入驗(yàn)證碼并提交,前端將用戶輸入的驗(yàn)證碼發(fā)送給后端;

6.后端接受到前端發(fā)送的驗(yàn)證碼,首先判斷驗(yàn)證碼是否為空;

7.后端然后獲取當(dāng)前請(qǐng)求對(duì)應(yīng)存儲(chǔ)的session,從中提取圖形驗(yàn)證碼的值和時(shí)間;

8.后端比對(duì)前端的驗(yàn)證碼和session中存儲(chǔ)的驗(yàn)證碼,并判斷當(dāng)前時(shí)間和session中存儲(chǔ)的時(shí)間差;

9.如果前端的驗(yàn)證碼和session中存儲(chǔ)的驗(yàn)證碼相同,并且當(dāng)前時(shí)間和session中存儲(chǔ)的時(shí)間差小于設(shè)定的值,那么就返回true,否則返回false;

10.前端接收到后端的響應(yīng),判斷響應(yīng)返回的值是否為true,如果為true,則跳轉(zhuǎn)到驗(yàn)證成功的頁(yè)面。

后端代碼 

application.yml

captcha:
  width: 200
  height: 100
  session:
    key: captcha_session_key
    date: captcha_session_date

CaptchaProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session;

    @Data
    public static class Session{
        private String key;
        private String date;
    }

}

CaptchaController

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;
import com.wmh.captcha.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RequestMapping("/captcha")
@RestController
public class DCaptchaController {
    private final static long session_valid_timeout = 60 * 1000;

    @Autowired
    private CaptchaProperties captchaProperties;



    @RequestMapping("/get")
    public void getCaptcha(HttpSession session, HttpServletResponse response){
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
        //設(shè)置返回類型
        response.setContentType("image/jpeg");
        //禁止緩存
        response.setHeader("Progma", "No-cache");
        Console.log(lineCaptcha.getCode());
        //圖形驗(yàn)證碼寫(xiě)出,可以寫(xiě)出到文件,也可以寫(xiě)出到流
        try {
            lineCaptcha.write(response.getOutputStream());
            //存儲(chǔ)session
            session.setAttribute(captchaProperties.getSession().getKey(),lineCaptcha.getCode());
            session.setAttribute(captchaProperties.getSession().getDate(), new Date());
            response.getOutputStream().close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @RequestMapping("/check")
    public Boolean check(String inputCode, HttpSession session){

        //驗(yàn)證碼生成的內(nèi)容, 和用戶輸入的進(jìn)行比較
        if (!StringUtils.hasLength(inputCode)){
            return false;
        }
        //從session獲取信息
        String savedCode = (String) session.getAttribute(captchaProperties.getSession().getKey());
        Date saveDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());
        if (inputCode.equalsIgnoreCase(savedCode)){
            //判斷驗(yàn)證碼是否過(guò)期
            if (saveDate!=null && System.currentTimeMillis()-saveDate.getTime() < session_valid_timeout){
                return true;
            }
        }

        return false;
    }

}

前端代碼

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>驗(yàn)證碼</title>
    <style>
        #inputCaptcha {
            height: 30px;
            vertical-align: middle;
        }
        #verificationCodeImg{
            vertical-align: middle;
        }
        #checkCaptcha{
            height: 40px;
            width: 100px;
        }
    </style>
</head>
<body>
<h1>輸入驗(yàn)證碼</h1>
<div id="confirm">
    <input type="text" name="inputCaptcha" id="inputCaptcha">
    <img id="verificationCodeImg" src="/captcha/get" style="cursor: pointer;" title="看不清?換一張" />
    <input type="button" value="提交" id="checkCaptcha">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
    $("#verificationCodeImg").click(function(){
        $(this).hide().attr('src', '/captcha/get?dt=' + new Date().getTime()).fadeIn();
    });
    $("#checkCaptcha").click(function () {
        console.log('按鈕被點(diǎn)擊了');  // 調(diào)試信息
        $.ajax({
            url: "/captcha/check",
            type: "post",
            data: {
                inputCode: $("#inputCaptcha").val()
            },
            success: function(result){
                console.log(result);
                if(result){
                    location.href = "success.html";
                } else {
                    alert("驗(yàn)證碼錯(cuò)誤或者過(guò)期");
                }
            },
            error: function(xhr, status, error) {
                console.error('請(qǐng)求失敗:', status, error);  // 調(diào)試信息
            }
        });
    });
</script>
</body>
</html>

 success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>驗(yàn)證成功頁(yè)</title>
</head>
<body>
<h1>驗(yàn)證成功</h1>
</body>
</html>

運(yùn)行結(jié)果

到此這篇關(guān)于java使用Hutool工具庫(kù)實(shí)現(xiàn)圖形驗(yàn)證碼的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)圖形驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java常見(jiàn)事件響應(yīng)方法實(shí)例匯總

    java常見(jiàn)事件響應(yīng)方法實(shí)例匯總

    這篇文章主要介紹了java常見(jiàn)事件響應(yīng)方法,對(duì)于初學(xué)者有很好的參考借鑒價(jià)值,分享給大家,需要的朋友可以參考下
    2014-08-08
  • Security框架:如何使用CorsFilter解決前端跨域請(qǐng)求問(wèn)題

    Security框架:如何使用CorsFilter解決前端跨域請(qǐng)求問(wèn)題

    這篇文章主要介紹了Security框架:如何使用CorsFilter解決前端跨域請(qǐng)求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    本篇是基于TornadoFx框架對(duì)Tooltip組件進(jìn)行講解,使用Kotlin語(yǔ)言,和傳統(tǒng)Java使用有所區(qū)別,本章節(jié)包括對(duì)tooltip的樣式定制化以及指定窗口顯示,對(duì)JavaFx?Tooltip懸浮提示使用及自定義相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-12-12
  • 處理Log4j2不能打印行號(hào)的問(wèn)題(AsyncLogger)

    處理Log4j2不能打印行號(hào)的問(wèn)題(AsyncLogger)

    這篇文章主要介紹了處理Log4j2不能打印行號(hào)的問(wèn)題(AsyncLogger),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • List、Map、Set接口在Java中的存取元素特點(diǎn)詳細(xì)探討

    List、Map、Set接口在Java中的存取元素特點(diǎn)詳細(xì)探討

    在Java編程語(yǔ)言中集合框架是處理對(duì)象組的重要工具,主要包括List、Set和Map接口,這些接口及其實(shí)現(xiàn)類提供了豐富的功能,這篇文章主要給大家介紹了關(guān)于List、Map、Set接口在Java中的存取元素特點(diǎn),需要的朋友可以參考下
    2024-08-08
  • 詳解Spring Aop實(shí)例之AspectJ注解配置

    詳解Spring Aop實(shí)例之AspectJ注解配置

    本篇文章主要介紹了詳解Spring Aop實(shí)例之AspectJ注解配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java8如何根據(jù)list對(duì)象中的屬性過(guò)濾篩選

    java8如何根據(jù)list對(duì)象中的屬性過(guò)濾篩選

    這篇文章主要介紹了java8如何根據(jù)list對(duì)象中的屬性過(guò)濾篩選,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SpringBoot統(tǒng)一API響應(yīng)結(jié)果封裝的示例詳解

    SpringBoot統(tǒng)一API響應(yīng)結(jié)果封裝的示例詳解

    在Spring Boot項(xiàng)目中,統(tǒng)一API響應(yīng)結(jié)果封裝是一種常用的技術(shù)實(shí)踐,旨在提高開(kāi)發(fā)效率、降低代碼重復(fù)率,并提供一致的API響應(yīng)格式,從而簡(jiǎn)化前后端交互和錯(cuò)誤處理,感興趣的小伙伴可以了解下
    2025-03-03
  • Java集合之Disruptor操作示例

    Java集合之Disruptor操作示例

    這篇文章主要為大家介紹了Java集合之Disruptor操作示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java實(shí)現(xiàn)五子棋游戲

    Java實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論

老河口市| 花莲县| 邢台县| 安泽县| 鲁甸县| 东乡族自治县| 邵阳县| 康平县| 南川市| 台中市| 淳安县| 六安市| 东乡族自治县| 临颍县| 汉阴县| 盱眙县| 西乡县| 林口县| 荆门市| 梁河县| 长宁区| 合山市| 南召县| 通化市| 石柱| 梓潼县| 雷州市| 长海县| 融水| 习水县| 尤溪县| 永丰县| 太湖县| 扎赉特旗| 家居| 嵩明县| 鄂托克前旗| 秦皇岛市| 乡城县| 淮南市| 南和县|