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

SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼

 更新時間:2024年01月15日 10:02:38   作者:彭于晏689  
圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下

圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,能夠防止操作者利用機器進行暴力破解、惡意注冊、濫用服務(wù)、批量化操作和自動發(fā)布等行為。

在這里插入圖片描述

創(chuàng)建一個實體類封裝,給前端返回的驗證碼數(shù)據(jù):

@Data
public class ValidateCodeVo {

    private String codeKey ;        // 驗證碼的key
    private String codeValue ;      // 圖片驗證碼對應(yīng)的字符串數(shù)據(jù)

}

業(yè)務(wù)層代碼實現(xiàn):

public interface ValidateCodeService {

    // 獲取驗證碼圖片
    public abstract ValidateCodeVo generateValidateCode();

}
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
?
    @Autowired
    private RedisTemplate<String , String> redisTemplate ;
?
    @Override
    public ValidateCodeVo generateValidateCode() {
?
        // 使用hutool工具包中的工具類生成圖片驗證碼
        //參數(shù):寬  高  驗證碼位數(shù) 干擾線數(shù)量
        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);
        String codeValue = circleCaptcha.getCode();
        String imageBase64 = circleCaptcha.getImageBase64();
?
        // 生成uuid作為圖片驗證碼的key
        String codeKey = UUID.randomUUID().toString().replace("-", "");
?
        // 將驗證碼存儲到Redis中
        redisTemplate.opsForValue().set("user:login:validatecode:" + codeKey , codeValue , 5 , TimeUnit.MINUTES);
?
        // 構(gòu)建響應(yīng)結(jié)果數(shù)據(jù)
        ValidateCodeVo validateCodeVo = new ValidateCodeVo() ;
        validateCodeVo.setCodeKey(codeKey);
        validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);
?
        // 返回數(shù)據(jù)
        return validateCodeVo;
    }
?
}

在Controller中添加獲取驗證碼接口方法:

@Autowired
private ValidateCodeService validateCodeService;

@GetMapping(value = "/generateValidateCode")
public Result<ValidateCodeVo> generateValidateCode() {
    ValidateCodeVo validateCodeVo = validateCodeService.generateValidateCode();
    return Result.build(validateCodeVo , ResultCodeEnum.SUCCESS) ;
}

在登錄的業(yè)務(wù)層實現(xiàn)驗證碼校驗:

 /**
     * 用戶登錄
     * @param loginDto
     * @return
     */
    @Override
    public LoginVo login(LoginDto loginDto) {
        //獲取輸入的驗證碼和存儲到redis的key名稱
        String captcha = loginDto.getCaptcha();
        String key = loginDto.getCodeKey();

        //根據(jù)獲取的redis的key 查詢redis里面存儲的驗證碼
        String redisCode = redisTemplate.opsForValue().get("user:validate" + key);

        // 比較輸入的和redis存儲驗證碼是否一致
        if(StrUtil.isEmpty(redisCode) || !StrUtil.equalsIgnoreCase(redisCode,captcha)){
            //提示用戶,校驗失敗
            throw new GuiguException(ResultCodeEnum.VALIDATECODE_ERROR);
        }

        // 如果一致,刪除redis里面驗證碼
        redisTemplate.delete("user:validate" + key);

        // 1.獲取提交的用戶名
        String userName = loginDto.getUserName();

        // 2.根據(jù)用戶名查詢用戶表
        SysUser sysUser = sysUserMapper.selectUserInfoByUserName(userName);

        // 3.如果根據(jù)用戶名查不到對應(yīng)的信息,用戶不存在,返回錯誤信息
        if(sysUser == null){
            //throw new RuntimeException("用戶名不存在");
            throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
        }

        // 4.根據(jù)用戶名查詢用戶信息,用戶存在
        // 5.獲取輸入的密碼,比較輸入的密碼和數(shù)據(jù)庫的密碼是否一致
        String database_assword = sysUser.getPassword();
        // 把輸入的密碼進行加密 再比較數(shù)據(jù)庫的密碼
        String input_password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes());

        //比較
        if(!input_password.equals(database_assword)){
//            throw new RuntimeException("密碼不正確");
            throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
        }

        // 6.如果密碼一致,登陸成功,如果你密碼不一致登陸失敗
        // 7.登陸成功,生產(chǎn)用戶的唯一標識token
        String token = UUID.randomUUID().toString().replaceAll("-", "");

        // 8.把登陸成功的用戶信息放到redis里面
        // key:token value:用戶信息

        redisTemplate.opsForValue().set("user:login"+token,JSON.toJSONString(sysUser),7, TimeUnit.DAYS);
        // 9.返回loginvo對象
        LoginVo loginVo = new LoginVo();
        loginVo.setToken(token);
        return loginVo;
    }

到此這篇關(guān)于SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Hutool圖片驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 關(guān)于List、Map、Stream初始化方式

    關(guān)于List、Map、Stream初始化方式

    這篇文章主要介紹了關(guān)于List、Map、Stream初始化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    這篇文章主要為大家介紹了Spring?Security權(quán)限注解啟動及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java線程中的Thread.yield()詳細解析

    Java線程中的Thread.yield()詳細解析

    這篇文章主要介紹了Java線程中的Thread.yield()詳細解析,yield()讓當前線程從運行狀態(tài)?轉(zhuǎn)為?就緒狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行機會,需要的朋友可以參考下
    2023-11-11
  • MyBatis3傳遞多個參數(shù)(Multiple Parameters)

    MyBatis3傳遞多個參數(shù)(Multiple Parameters)

    這篇文章主要介紹了MyBatis3傳遞多個參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringMVC之@InitBinder注解詳解

    SpringMVC之@InitBinder注解詳解

    這篇文章主要介紹了SpringMVC之@InitBinder注解詳解,springmvc并不是能對所有類型的參數(shù)進行綁定的,如果對日期Date類型參數(shù)進行綁定,就會報錯IllegalStateException錯誤,需要的朋友可以參考下
    2024-01-01
  • Spring Security 圖片驗證碼功能的實例代碼

    Spring Security 圖片驗證碼功能的實例代碼

    spring security是一系列的過濾器鏈,所以在這里驗證碼也聲明為過濾器,加在過濾器鏈的 登錄過濾器之前,然后自定義一個異常類,來響應(yīng)驗證碼的錯誤信息.這篇文章主要介紹了Spring Security 圖片驗證碼,需要的朋友可以參考下
    2018-03-03
  • java.io.EOFException產(chǎn)生原因及解決方法(附代碼)

    java.io.EOFException產(chǎn)生原因及解決方法(附代碼)

    java.io.EOFException表示在讀取數(shù)據(jù)時突然遇到了文件或流的末尾,也就是說客戶端或服務(wù)器已經(jīng)關(guān)閉了連接,但是你還在嘗試讀取數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java.io.EOFException產(chǎn)生原因及解決的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Java實現(xiàn)二維數(shù)組和稀疏數(shù)組之間的轉(zhuǎn)換

    Java實現(xiàn)二維數(shù)組和稀疏數(shù)組之間的轉(zhuǎn)換

    本文主要介紹了Java 二維數(shù)組和稀疏數(shù)組轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • Spring創(chuàng)建Bean的關(guān)鍵流程分享

    Spring創(chuàng)建Bean的關(guān)鍵流程分享

    Spring中的Bean生命周期從創(chuàng)建到銷毀分為多個階段,包括實例化、屬性填充、Aware回調(diào)、初始化前處理、初始化處理、初始化后處理、Bean就緒和銷毀,每個階段都有特定的任務(wù),例如屬性注入、初始化方法調(diào)用和資源釋放等,Spring通過三級緩存機制解決循環(huán)依賴問題
    2026-04-04
  • Java通俗易懂講解泛型

    Java通俗易懂講解泛型

    在正式進入內(nèi)容之前說明一下:泛型的內(nèi)容太多,也太復雜。這里因為Java中寫數(shù)據(jù)結(jié)構(gòu)的時候會使用到,所以加上。關(guān)于泛型我找了挺多文章,再結(jié)合自己的理解,盡可能將其講清楚。不求會使用泛型,只要求后面數(shù)據(jù)結(jié)構(gòu)出現(xiàn)泛型的時候能夠知道是在干什么即可
    2022-05-05

最新評論

隆昌县| 赤峰市| 吴堡县| 忻城县| 合水县| 墨竹工卡县| 合水县| 儋州市| 苍溪县| 黎川县| 滦南县| 昌都县| 和龙市| 农安县| 彭阳县| 吉水县| 岱山县| 邮箱| 岳阳市| 乐清市| 江山市| 彭山县| 广德县| 梅州市| 房产| 乐安县| 淅川县| 昭平县| 汉源县| 榕江县| 南华县| 德江县| 会理县| 利津县| 邯郸市| 墨玉县| 江安县| 磐安县| 囊谦县| 滕州市| 应用必备|