欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證

 更新時間:2023年12月04日 15:28:15   作者:相思比夢長  
在springboot的登陸頁面中為了防止機器大規(guī)模注冊,機器暴力破解數(shù)據(jù)密碼等危害,需要驗證隨機生成的驗證碼,本文主要介紹了SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證,感興趣的可以了解一下

生成驗證碼

提供一個接口, 這個接口里,我們將生成的驗證碼存入session,然后將驗證碼以圖片格式或者base64編碼串返回給調(diào)用端。

校驗驗證碼

提供一個接口,這個接口里,我們收到調(diào)用端傳過來的校驗碼,然后從session取出驗證碼,兩個驗證碼都全部轉(zhuǎn)小寫,進行無大小寫區(qū)分匹配校驗,返回true/flase 。

1、pom文件中導(dǎo)入hutool-captcha依賴

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

2、創(chuàng)建后端控制類生成驗證碼

創(chuàng)建控制類CommonController類,一方面通過流的方式將隨機生成的驗證碼圖片信息發(fā)送到前端瀏覽器;另一方面將驗證碼中的驗證信息寫入session中,以方便后續(xù)的驗證。

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;

import cn.hutool.captcha.ShearCaptcha;
import VerifyCodeVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author author
 */
@RestController
@Api(tags = "驗證碼工具類")
public class CommonController {
    @Resource
    RedisTemplate<String, String> redisTemplate;

    /**
     * 方法一 ShearCaptcha
     * 圖片格式
     * session存儲
     * 接口需添加白名單放行
     *
     * @param request HttpServletRequest
     */
    @GetMapping("/verify")
    @ApiOperation("生成驗證碼")
    public void verify(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        shearCaptcha.write(response.getOutputStream());
        //獲取驗證碼中的文字內(nèi)容
        request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());
    }

    /**
     * 方法二 LineCaptcha
     * 圖片格式
     * session存儲
     * 接口需添加白名單放行
     *
     * @param request HttpServletRequest
     */
    @GetMapping("/verifyTwo")
    @ApiOperation("生成驗證碼")
    public void verifyTwo(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        ImageIO.write(lineCaptcha.getImage(), "JPEG", response.getOutputStream());
        //獲取驗證碼中的文字內(nèi)容
        request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());
    }

    /**
     * 方法三 ShearCaptcha
     * 圖片的base64編碼字符串
     * session存儲
     * 接口需添加白名單放行
     *
     * @param request HttpServletRequest
     * @return String
     */
    @GetMapping("/getVerify")
    @ApiOperation("生成驗證碼")
    public String getVerify(HttpServletRequest request) {
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);
        //獲取驗證碼中的文字內(nèi)容
        request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());
        String base64String = "";
        try {
            base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return base64String;
    }

    /**
     * 方法四 LineCaptcha
     * 圖片的base64編碼字符串
     * session存儲
     * 接口需添加白名單放行
     *
     * @param request HttpServletRequest
     * @return String
     */
    @GetMapping("/getVerifyTwo")
    @ApiOperation("生成驗證碼")
    public String getVerifyTwo(HttpServletRequest request) {
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);
        //獲取驗證碼中的文字內(nèi)容
        request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());
        String base64String = "";
        try {
            //返回 base64
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);
            byte[] bytes = bos.toByteArray();
            Base64.Encoder encoder = Base64.getEncoder();
            base64String = "data:image/png;base64," + encoder.encodeToString(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return base64String;
    }

    /**
     * 方法五 ShearCaptcha
     * 圖片的base64編碼字符串
     * redis存儲
     * 接口需添加白名單放行
     *
     * @return String
     */
    @GetMapping("/getVerifyThree")
    @ApiOperation("生成驗證碼")
    public VerifyCodeVO getVerifyThree() {
        String captchaKey = UUID.randomUUID().toString();
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 0);
        // 存入redis并設(shè)置過期時間為30分鐘
        redisTemplate.opsForValue().set("captcha:" + captchaKey, shearCaptcha.getCode(), 30L, TimeUnit.MINUTES);
        //captcha:d6e561a6-7929-4469-8154-008710932f61
        String base64String = "";
        try {
            base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();
        } catch (Exception e) {
            e.printStackTrace();
        }
        VerifyCodeVO verifyCodeVO = new VerifyCodeVO();
        verifyCodeVO.setCaptchaKey(captchaKey);
        verifyCodeVO.setCaptchaImg(base64String);
        return verifyCodeVO;
    }

    /**
     * 方法六 LineCaptcha
     * 圖片的base64編碼字符串
     * redis存儲
     * 接口需添加白名單放行
     *
     * @return String
     */
    @GetMapping("/getVerifyFour")
    @ApiOperation("生成驗證碼")
    public VerifyCodeVO getVerifyFour() {
        String captchaKey = UUID.randomUUID().toString();
        //定義圖形驗證碼的長、寬、驗證碼字符數(shù)、干擾線寬度
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);
        // 存入redis并設(shè)置過期時間為30分鐘
        redisTemplate.opsForValue().set("captcha:" + captchaKey, lineCaptcha.getCode(), 30L, TimeUnit.MINUTES);
        //captcha:d6e561a6-7929-4469-8154-008710932f61
        String base64String = "";
        try {
            //返回 base64
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);
            byte[] bytes = bos.toByteArray();
            Base64.Encoder encoder = Base64.getEncoder();
            base64String = "data:image/png;base64," + encoder.encodeToString(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        VerifyCodeVO verifyCodeVO = new VerifyCodeVO();
        verifyCodeVO.setCaptchaKey(captchaKey);
        verifyCodeVO.setCaptchaImg(base64String);
        return verifyCodeVO;
    }
}

3、實現(xiàn)驗證碼的驗證與返回結(jié)果

對前端輸入的數(shù)據(jù)并發(fā)送到服務(wù)器的驗證信息進行校驗,當(dāng)輸入信息與驗證碼信息一致則返回true,否則返回false。

     /**
     * session存儲
     *
     * @param captchaCode 驗證碼
     * @param request     HttpServletRequest
     * @return boolean
     */
    @GetMapping("/checkCaptcha")
    @ApiOperation("驗證碼校驗")
    public boolean getCheckCaptcha(@RequestParam("captchaCode") String captchaCode, HttpServletRequest request) {
        try {
            // toLowerCase() 不區(qū)分大小寫進行驗證碼校驗
            String sessionCode = String.valueOf(request.getSession().getAttribute("verifyCode")).toLowerCase();
            System.out.println("session里的驗證碼:" + sessionCode);
            String receivedCode = captchaCode.toLowerCase();
            System.out.println("用戶的驗證碼:" + receivedCode);
            return !"".equals(sessionCode) && !"".equals(receivedCode) && sessionCode.equals(receivedCode);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * redis存儲
     *
     * @param captchaCode 驗證碼
     * @param request     HttpServletRequest
     * @return boolean
     */
    @GetMapping("/checkCaptchaTwo")
    @ApiOperation("驗證碼校驗")
    @ApiImplicitParam(value = "Captcha-Key", name = "Captcha-Key", paramType = "header", dataType = "String", required = true)
    public boolean getCheckCaptchaTwo(@RequestParam("captchaCode") String captchaCode, HttpServletRequest request) {
        try {
            // toLowerCase() 不區(qū)分大小寫進行驗證碼校驗
            String redisCode = String.valueOf(redisTemplate.opsForValue().get("captcha:" + request.getHeader("Captcha-Key"))).toLowerCase();
            System.out.println("redisCode里的驗證碼:" + redisCode);
            String receivedCode = captchaCode.toLowerCase();
            System.out.println("用戶的驗證碼:" + receivedCode);
            return !"".equals(redisCode) && !"".equals(receivedCode) && redisCode.equals(receivedCode);
        } catch (Exception e) {
            return false;
        }
    }

 Redis存儲,返回工具類:

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
public class VerifyCodeVO implements Serializable {
    @ApiModelProperty(value = "header頭參數(shù):Captcha-Key")
    private String captchaKey;
    @ApiModelProperty(value = "驗證碼圖片")
    private String captchaImg;
}

啟動應(yīng)用,訪問 http://localhost:8080/verify 即可得到驗證碼,如圖: 

 前端調(diào)用展示:在img標(biāo)簽中src屬性調(diào)用 /verify 接口,將傳過來的圖片驗證碼顯示即可。若想換一張顯示(刷新驗證碼):在img標(biāo)簽中增加一個onclick屬性點擊事件即可。

    <img src="/verify" id="verifyCode" onclick="refresh()" alt="驗證碼" />
    <script>
        /* 刷新驗證碼 */
        function refresh() {
            document.getElementById("verifyCode").src = "verify?time=" + new Date().getTime();
        }
    </script>

到此這篇關(guān)于SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證的文章就介紹到這了,更多相關(guān)SpringBoot驗證碼生成與驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程

    web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程

    這篇文章主要為大家介紹了web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • List集合按某個屬性或者字段進行分組的操作

    List集合按某個屬性或者字段進行分組的操作

    這篇文章主要介紹了List集合按某個屬性或者字段進行分組的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot淺析Redis訪問操作使用

    SpringBoot淺析Redis訪問操作使用

    Redis是一個速度非常快的非關(guān)系數(shù)據(jù)庫(Non-Relational?Database),它可以存儲鍵(Key)與多種不同類型的值(Value)之間的映射(Mapping),可以將存儲在內(nèi)存的鍵值對數(shù)據(jù)持久化到硬盤,可以使用復(fù)制特性來擴展讀性能,還可以使用客戶端分片來擴展寫性能
    2022-11-11
  • Java 中實現(xiàn)異步的多種方式

    Java 中實現(xiàn)異步的多種方式

    文章介紹了Java中實現(xiàn)異步處理的幾種常見方式,每種方式都有其特點和適用場景,通過選擇合適的異步處理方式,可以提高程序的性能和可維護性,感興趣的朋友一起看看吧
    2025-03-03
  • bootstrap.yml如何讀取nacos配置中心的配置文件

    bootstrap.yml如何讀取nacos配置中心的配置文件

    這篇文章主要介紹了bootstrap.yml讀取nacos配置中心的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring boot 整合CXF開發(fā)web service示例

    Spring boot 整合CXF開發(fā)web service示例

    這篇文章主要介紹了Spring boot 整合CXF開發(fā)web service示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 使用JAR包中MANIFEST.MF的注意事項

    使用JAR包中MANIFEST.MF的注意事項

    這篇文章主要介紹了使用JAR包中MANIFEST.MF的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MyBatis中操作類對象的實現(xiàn)

    MyBatis中操作類對象的實現(xiàn)

    在MyBatis框架中,操作類對象是用于執(zhí)行數(shù)據(jù)庫操作的核心對象,本文主要介紹了MyBatis中操作類對象的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 一文教你如何使用Java靈活讀取Excel內(nèi)容

    一文教你如何使用Java靈活讀取Excel內(nèi)容

    這篇文章主要給大家介紹了關(guān)于如何使用Java靈活讀取Excel內(nèi)容的相關(guān)資料,讀取Excel數(shù)據(jù)是Java開發(fā)中常見的任務(wù),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 關(guān)于SpringBoot簡介、官網(wǎng)構(gòu)建、快速啟動的問題

    關(guān)于SpringBoot簡介、官網(wǎng)構(gòu)建、快速啟動的問題

    SpringBoot 是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化Spring應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了SpringBoot簡介、官網(wǎng)構(gòu)建、快速啟動,需要的朋友可以參考下
    2022-07-07

最新評論