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

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

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

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

在這里插入圖片描述

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

@Data
public class ValidateCodeVo {

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

}

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

public interface ValidateCodeService {

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

}
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
?
    @Autowired
    private RedisTemplate<String , String> redisTemplate ;
?
    @Override
    public ValidateCodeVo generateValidateCode() {
?
        // 使用hutool工具包中的工具類生成圖片驗(yàn)證碼
        //參數(shù):寬  高  驗(yàn)證碼位數(shù) 干擾線數(shù)量
        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);
        String codeValue = circleCaptcha.getCode();
        String imageBase64 = circleCaptcha.getImageBase64();
?
        // 生成uuid作為圖片驗(yàn)證碼的key
        String codeKey = UUID.randomUUID().toString().replace("-", "");
?
        // 將驗(yàn)證碼存儲到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);
?
        // 返回?cái)?shù)據(jù)
        return validateCodeVo;
    }
?
}

在Controller中添加獲取驗(yàn)證碼接口方法:

@Autowired
private ValidateCodeService validateCodeService;

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

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

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

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

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

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

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

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

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

        // 4.根據(jù)用戶名查詢用戶信息,用戶存在
        // 5.獲取輸入的密碼,比較輸入的密碼和數(shù)據(jù)庫的密碼是否一致
        String database_assword = sysUser.getPassword();
        // 把輸入的密碼進(jìn)行加密 再比較數(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)用戶的唯一標(biāo)識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實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Hutool圖片驗(yàn)證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

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

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

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

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

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

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

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

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

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

    SpringMVC之@InitBinder注解詳解

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

    Spring Security 圖片驗(yàn)證碼功能的實(shí)例代碼

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

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

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

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

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

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

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

    Java通俗易懂講解泛型

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

最新評論

崇州市| 夏河县| 宁河县| 淄博市| 阆中市| 轮台县| 张家界市| 封丘县| 年辖:市辖区| 贡山| 武陟县| 安西县| 夹江县| 法库县| 凭祥市| 浙江省| 道真| 瑞昌市| 富顺县| 彭阳县| 怀安县| 灵川县| 新巴尔虎左旗| 铁力市| 响水县| 纳雍县| 南通市| 拉孜县| 万安县| 广德县| 连城县| 华阴市| 上林县| 禄劝| 离岛区| 云和县| 宝山区| 江源县| 景宁| 朝阳市| 罗城|