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

java使用Hutool工具庫實現圖形驗證碼

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

下面將使用Hutool工具庫來輔助完成驗證碼的實現。

關于Hutool的介紹

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

Hutool中的工具方法來自每個用戶的精雕細琢,它涵蓋了Java開發(fā)底層代碼中的方方面面,它既是大型項目開發(fā)中解決小問題的利器,也是小型項目中的效率擔當;

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

引入依賴

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

圖形驗證碼

介紹

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

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

其中write方法只有一個OutputStream,ICaptcha實現類可以根據這個方法封裝寫出到文件等方法。

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

LineCaptcha實現線段干擾的驗證碼

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) {
        //定義圖形驗證碼的長和寬
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);


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

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

運行結果:

得到的圖形驗證碼:

CircleCaptcha實現圓圈干擾驗證碼

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) {
        //定義圖形驗證碼的長、寬、驗證碼字符數、干擾元素個數
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
        //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        captcha.write("d:/circle.png");
        Console.log(captcha.getCode());
        //驗證圖形驗證碼的有效性,返回boolean值
        captcha.verify("1234");
    }
}

運行結果:

得到的圖形驗證碼:

ShearCaptcha實現擾亂干擾驗證碼

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) {
        //定義圖形驗證碼的長、寬、驗證碼字符數、干擾線寬度
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
        //ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        captcha.write("d:/shear.png");
        Console.log(captcha.getCode());
        //驗證圖形驗證碼的有效性,返回boolean值
        captcha.verify("1234");
    }
}

運行結果:

得到的圖形驗證碼:

線段干擾驗證碼實現登錄驗證

線段干擾驗證碼實現登錄驗證步驟詳解:

1.圖形驗證碼登錄分為前端和后端;

2.前端首先會向后端發(fā)起請求獲取圖形驗證碼;

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

4.于此同時,后端將剛剛生成的圖形驗證碼的值存放到session里面,包括當時的時間;

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

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

7.后端然后獲取當前請求對應存儲的session,從中提取圖形驗證碼的值和時間;

8.后端比對前端的驗證碼和session中存儲的驗證碼,并判斷當前時間和session中存儲的時間差;

9.如果前端的驗證碼和session中存儲的驗證碼相同,并且當前時間和session中存儲的時間差小于設定的值,那么就返回true,否則返回false;

10.前端接收到后端的響應,判斷響應返回的值是否為true,如果為true,則跳轉到驗證成功的頁面。

后端代碼 

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());
        //設置返回類型
        response.setContentType("image/jpeg");
        //禁止緩存
        response.setHeader("Progma", "No-cache");
        Console.log(lineCaptcha.getCode());
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        try {
            lineCaptcha.write(response.getOutputStream());
            //存儲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){

        //驗證碼生成的內容, 和用戶輸入的進行比較
        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)){
            //判斷驗證碼是否過期
            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>驗證碼</title>
    <style>
        #inputCaptcha {
            height: 30px;
            vertical-align: middle;
        }
        #verificationCodeImg{
            vertical-align: middle;
        }
        #checkCaptcha{
            height: 40px;
            width: 100px;
        }
    </style>
</head>
<body>
<h1>輸入驗證碼</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('按鈕被點擊了');  // 調試信息
        $.ajax({
            url: "/captcha/check",
            type: "post",
            data: {
                inputCode: $("#inputCaptcha").val()
            },
            success: function(result){
                console.log(result);
                if(result){
                    location.href = "success.html";
                } else {
                    alert("驗證碼錯誤或者過期");
                }
            },
            error: function(xhr, status, error) {
                console.error('請求失敗:', status, error);  // 調試信息
            }
        });
    });
</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>驗證成功頁</title>
</head>
<body>
<h1>驗證成功</h1>
</body>
</html>

運行結果

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

相關文章

  • java常見事件響應方法實例匯總

    java常見事件響應方法實例匯總

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

    Security框架:如何使用CorsFilter解決前端跨域請求問題

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

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

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

    處理Log4j2不能打印行號的問題(AsyncLogger)

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

    List、Map、Set接口在Java中的存取元素特點詳細探討

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

    詳解Spring Aop實例之AspectJ注解配置

    本篇文章主要介紹了詳解Spring Aop實例之AspectJ注解配置,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • java8如何根據list對象中的屬性過濾篩選

    java8如何根據list對象中的屬性過濾篩選

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

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

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

    Java集合之Disruptor操作示例

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

    Java實現五子棋游戲

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

最新評論

通州区| 吴堡县| 江源县| 衡东县| 安塞县| 长治县| 广昌县| 漳浦县| 封丘县| 保山市| 德安县| 沁水县| 邻水| 滕州市| 涿鹿县| 香格里拉县| 奉节县| 全椒县| 繁峙县| 噶尔县| 文化| 嵩明县| 鹰潭市| 唐海县| 乌兰浩特市| 柞水县| 宁阳县| 邯郸市| 卢氏县| 梁山县| 杭州市| 城固县| 开鲁县| 大英县| 齐河县| 华安县| 丁青县| 东乌珠穆沁旗| 乌什县| 甘肃省| 苏州市|