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

Spring Boot 驗(yàn)證碼框架 CAPTCHA詳解

 更新時(shí)間:2021年03月22日 09:09:38   作者:Hansin1997  
這篇文章主要介紹了Spring Boot 驗(yàn)證碼框架 CAPTCHA詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

CAPTCHA

查看 Github 倉(cāng)庫(kù) | 查看 Gitee 倉(cāng)庫(kù)

簡(jiǎn)介

人機(jī)識(shí)別與驗(yàn)證碼是后端開(kāi)發(fā)中保護(hù)接口最常見(jiàn)的方式之一,而此類(lèi)代碼往往會(huì)與業(yè)務(wù)代碼耦合帶來(lái)項(xiàng)目可維護(hù)性變差。

CAPTCHA 是一個(gè)基于 Spring Boot 的驗(yàn)證碼框架,它通過(guò) AOP 的方式完成包含驗(yàn)證碼生成、發(fā)送、存儲(chǔ)等驗(yàn)證碼相關(guān)業(yè)務(wù),以避免與業(yè)務(wù)代碼耦合。
開(kāi)發(fā)者可以輕松地通過(guò)不同組件的組合來(lái)完成驗(yàn)證業(yè)務(wù),同時(shí)可以進(jìn)行自定義實(shí)現(xiàn)以應(yīng)對(duì)自身的業(yè)務(wù)需求(例如郵箱驗(yàn)證碼、短信驗(yàn)證碼)。

代碼示例

導(dǎo)入 Maven 依賴(lài)

<dependency>
 <groupId>cn.dustlight.captcha</groupId>
 <artifactId>captcha-core</artifactId>
 <version>0.0.6</version>
</dependency>

添加注解啟用 CAPTCHA

@SpringBootApplication
@EnableCaptcha // 啟用 CAPTCHA
public class DemoApplication {
 public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }
}

使用注解生產(chǎn)驗(yàn)證碼

 @RequestMapping("/captcha")
 @SendCode // 生成隨機(jī)字符圖像驗(yàn)證碼并發(fā)送
 public void captcha(@CodeValue String code) {
  // 在此處進(jìn)行自定義的業(yè)務(wù),驗(yàn)證碼的生成、發(fā)送與儲(chǔ)存已由注解 '@SendCode' 完成。
  log.info(code);
 }

使用注解消費(fèi)驗(yàn)證碼(保護(hù)接口)

 @RequestMapping("/")
 @VerifyCode
 public String index(@CodeValue String code) {
  // 在此處進(jìn)行自定義的業(yè)務(wù),驗(yàn)證碼的驗(yàn)證以及銷(xiāo)毀已由注解 '@VerifyCode' 完成。
  return String.format("Hello World! (%s)", code);
 }

實(shí)現(xiàn)原理

CAPTCHA 基于面向切面編程(AOP)思想,將驗(yàn)證碼業(yè)務(wù)劃分為兩個(gè)切面:

@SendCode

  1. 生成驗(yàn)證碼
  2. 儲(chǔ)存驗(yàn)證碼
  3. 發(fā)送驗(yàn)證碼

@VerifyCode

  • 讀取驗(yàn)證碼
  • 進(jìn)行驗(yàn)證

同時(shí)將驗(yàn)證碼業(yè)務(wù)抽象為下面幾個(gè)接口:

  • Code—— 驗(yàn)證碼
  • CodeGenerator—— 生成器
  • CodeSender—— 發(fā)送器
  • CodeStore—— 儲(chǔ)存器
  • CodeVerifier—— 驗(yàn)證器

例子

隨機(jī)字符圖像驗(yàn)證碼的 AOP 實(shí)現(xiàn)

業(yè)務(wù)分析

  •  客戶端訪問(wèn)驗(yàn)證碼接口獲取到圖像,同時(shí)后端服務(wù)將生成的驗(yàn)證碼儲(chǔ)存在 Session 或者 Redis。
  • 客戶端訪問(wèn)接口(登錄、注冊(cè)等),傳入?yún)?shù)以及驗(yàn)證碼,后端服務(wù)取出驗(yàn)證碼進(jìn)行校驗(yàn)。

模塊劃分

接口 實(shí)現(xiàn) 功能/描述
Code Code<String> 字符串型 Code ,內(nèi)有驗(yàn)證碼名、驗(yàn)證碼值。(驗(yàn)證碼名用于區(qū)分不同業(yè)務(wù)的驗(yàn)證碼)
CodeGenerator RandomStringCodeGenerator 隨機(jī)字符串生成,通過(guò)參數(shù)配置字符池以及長(zhǎng)度。
CodeSender ImageCodeSender 繪制圖像(隨機(jī)字符、干擾線),輸出到 Response。
CodeStore HttpSessionCodeStore 基于 Session 對(duì)驗(yàn)證碼進(jìn)行儲(chǔ)存與取出。
CodeVerifier StringEqualsCodeVerifier 字符串比較驗(yàn)證,通過(guò)參數(shù)配置是否大小寫(xiě)敏感以及是否 trim 。

業(yè)務(wù)邏輯

@SendCode

  1. 通過(guò) CodeGenerator生成 Code。
  2. 通過(guò) CodeStore儲(chǔ)存 Code
  3. 通過(guò) CodeSender輸出 Code。
  4. 執(zhí)行業(yè)務(wù)代碼。

@VerifyCode

  1. 從請(qǐng)求參數(shù)獲取待驗(yàn)證的驗(yàn)證碼。
  2. 通過(guò) CodeStore取出 Code。
  3. 通過(guò) CodeVerify進(jìn)行驗(yàn)證。
  4. 驗(yàn)證完成則執(zhí)行業(yè)務(wù)代碼,否則拋出異常。

拓展與組合

除了圖像驗(yàn)證碼(人機(jī)識(shí)別)以外,常見(jiàn)的驗(yàn)證碼業(yè)務(wù)或者人機(jī)識(shí)別業(yè)務(wù)例如:短信驗(yàn)證碼、郵箱驗(yàn)證碼、谷歌 reCAPTCHA 人機(jī)識(shí)別等都可以通過(guò)實(shí)現(xiàn)上述接口來(lái)完成業(yè)務(wù)。

例如,想要使用 Redis 儲(chǔ)存驗(yàn)證碼只需要通過(guò) RedisTemplate實(shí)現(xiàn) CodeStore即可,再通過(guò)模塊的組合使用可以輕易地完成自定義的驗(yàn)證碼業(yè)務(wù),同時(shí)又不影響業(yè)務(wù)代碼。

到此這篇關(guān)于Spring Boot 驗(yàn)證碼框架 - CAPTCHA的文章就介紹到這了,更多相關(guān)Spring Boot 驗(yàn)證碼框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例

    datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例

    本篇文章主要介紹了datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot使用布隆過(guò)濾器解決緩存穿透問(wèn)題

    SpringBoot使用布隆過(guò)濾器解決緩存穿透問(wèn)題

    緩存穿透是指當(dāng)緩存系統(tǒng)中無(wú)法命中需要的數(shù)據(jù)時(shí),會(huì)直接請(qǐng)求底層存儲(chǔ)系統(tǒng)(如數(shù)據(jù)庫(kù)),但是如果請(qǐng)求的數(shù)據(jù)根本不存在,那么大量的請(qǐng)求就會(huì)直接穿透緩存層,本文將給大家介紹一下SpringBoot使用布隆過(guò)濾器解決緩存穿透問(wèn)題,需要的朋友可以參考下
    2023-10-10
  • Spring中的@Autowired、@Qualifier和@Primary注解詳解

    Spring中的@Autowired、@Qualifier和@Primary注解詳解

    這篇文章主要介紹了Spring中的@Autowired、@Qualifier和@Primary注解詳解,@Autowired?注解,可以對(duì)類(lèi)成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作,@Autowired?是默認(rèn)根據(jù)?byType?進(jìn)行自動(dòng)裝配的,需要的朋友可以參考下
    2023-11-11
  • Spring?Boot?+?EasyExcel?+?SqlServer?進(jìn)行批量處理數(shù)據(jù)的高效方法

    Spring?Boot?+?EasyExcel?+?SqlServer?進(jìn)行批量處理數(shù)據(jù)的高效方法

    在日常開(kāi)發(fā)和工作中,我們可能要根據(jù)用戶上傳的文件做一系列的處理,本篇文章就以Excel表格文件為例,主要介紹了Spring?Boot?+?EasyExcel?+?SqlServer?進(jìn)行批量處理數(shù)據(jù)的高效方法,需要的朋友可以參考下
    2024-06-06
  • springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例

    springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例

    這篇文章主要為大家介紹了springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java時(shí)間處理第三方包Joda?Time使用詳解

    Java時(shí)間處理第三方包Joda?Time使用詳解

    這篇文章主要為大家介紹了Java時(shí)間處理第三方包Joda?Time使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java中的static的使用指南

    Java中的static的使用指南

    本文給大家簡(jiǎn)單總結(jié)了下java中的static的使用注意事項(xiàng)及方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-04-04
  • Java微信公眾平臺(tái)開(kāi)發(fā)(12) 微信用戶信息的獲取

    Java微信公眾平臺(tái)開(kāi)發(fā)(12) 微信用戶信息的獲取

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第十二步,微信用戶信息的獲取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Python學(xué)習(xí)之書(shū)寫(xiě)格式及變量命名

    Python學(xué)習(xí)之書(shū)寫(xiě)格式及變量命名

    這篇文章我們給大家總結(jié)了關(guān)于Python書(shū)寫(xiě)格式及變量命名,小編覺(jué)得這篇文章寫(xiě)的還不錯(cuò),有興趣的朋友跟著參考學(xué)習(xí)下,希望能夠給你帶來(lái)幫助
    2021-10-10
  • Spring學(xué)習(xí)之依賴(lài)注入的方法(三種)

    Spring學(xué)習(xí)之依賴(lài)注入的方法(三種)

    本篇文章主要介紹了Spring學(xué)習(xí)之依賴(lài)注入的方法(三種),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論