Spring Boot 驗證碼框架 CAPTCHA詳解
CAPTCHA
簡介
人機識別與驗證碼是后端開發(fā)中保護接口最常見的方式之一,而此類代碼往往會與業(yè)務代碼耦合帶來項目可維護性變差。
CAPTCHA 是一個基于 Spring Boot 的驗證碼框架,它通過 AOP 的方式完成包含驗證碼生成、發(fā)送、存儲等驗證碼相關業(yè)務,以避免與業(yè)務代碼耦合。
開發(fā)者可以輕松地通過不同組件的組合來完成驗證業(yè)務,同時可以進行自定義實現(xiàn)以應對自身的業(yè)務需求(例如郵箱驗證碼、短信驗證碼)。
代碼示例
導入 Maven 依賴
<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);
}
}
使用注解生產驗證碼
@RequestMapping("/captcha")
@SendCode // 生成隨機字符圖像驗證碼并發(fā)送
public void captcha(@CodeValue String code) {
// 在此處進行自定義的業(yè)務,驗證碼的生成、發(fā)送與儲存已由注解 '@SendCode' 完成。
log.info(code);
}
使用注解消費驗證碼(保護接口)
@RequestMapping("/")
@VerifyCode
public String index(@CodeValue String code) {
// 在此處進行自定義的業(yè)務,驗證碼的驗證以及銷毀已由注解 '@VerifyCode' 完成。
return String.format("Hello World! (%s)", code);
}
實現(xiàn)原理
CAPTCHA 基于面向切面編程(AOP)思想,將驗證碼業(yè)務劃分為兩個切面:
@SendCode
- 生成驗證碼
- 儲存驗證碼
- 發(fā)送驗證碼
@VerifyCode
- 讀取驗證碼
- 進行驗證
同時將驗證碼業(yè)務抽象為下面幾個接口:
Code—— 驗證碼CodeGenerator—— 生成器CodeSender—— 發(fā)送器CodeStore—— 儲存器CodeVerifier—— 驗證器
例子
隨機字符圖像驗證碼的 AOP 實現(xiàn)
業(yè)務分析
- 客戶端訪問驗證碼接口獲取到圖像,同時后端服務將生成的驗證碼儲存在 Session 或者 Redis。
- 客戶端訪問接口(登錄、注冊等),傳入參數(shù)以及驗證碼,后端服務取出驗證碼進行校驗。
模塊劃分
| 接口 | 實現(xiàn) | 功能/描述 |
|---|---|---|
| Code | Code<String> | 字符串型 Code ,內有驗證碼名、驗證碼值。(驗證碼名用于區(qū)分不同業(yè)務的驗證碼) |
| CodeGenerator | RandomStringCodeGenerator | 隨機字符串生成,通過參數(shù)配置字符池以及長度。 |
| CodeSender | ImageCodeSender | 繪制圖像(隨機字符、干擾線),輸出到 Response。 |
| CodeStore | HttpSessionCodeStore | 基于 Session 對驗證碼進行儲存與取出。 |
| CodeVerifier | StringEqualsCodeVerifier | 字符串比較驗證,通過參數(shù)配置是否大小寫敏感以及是否 trim 。 |
業(yè)務邏輯
@SendCode
- 通過
CodeGenerator生成Code。 - 通過
CodeStore儲存Code。 - 通過
CodeSender輸出Code。 - 執(zhí)行業(yè)務代碼。
@VerifyCode
- 從請求參數(shù)獲取待驗證的驗證碼。
- 通過
CodeStore取出Code。 - 通過
CodeVerify進行驗證。 - 驗證完成則執(zhí)行業(yè)務代碼,否則拋出異常。
拓展與組合
除了圖像驗證碼(人機識別)以外,常見的驗證碼業(yè)務或者人機識別業(yè)務例如:短信驗證碼、郵箱驗證碼、谷歌 reCAPTCHA 人機識別等都可以通過實現(xiàn)上述接口來完成業(yè)務。
例如,想要使用 Redis 儲存驗證碼只需要通過 RedisTemplate實現(xiàn) CodeStore即可,再通過模塊的組合使用可以輕易地完成自定義的驗證碼業(yè)務,同時又不影響業(yè)務代碼。
到此這篇關于Spring Boot 驗證碼框架 - CAPTCHA的文章就介紹到這了,更多相關Spring Boot 驗證碼框架內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中的@Autowired、@Qualifier和@Primary注解詳解
這篇文章主要介紹了Spring中的@Autowired、@Qualifier和@Primary注解詳解,@Autowired?注解,可以對類成員變量、方法和構造函數(shù)進行標注,完成自動裝配的工作,@Autowired?是默認根據?byType?進行自動裝配的,需要的朋友可以參考下2023-11-11
Spring?Boot?+?EasyExcel?+?SqlServer?進行批量處理數(shù)據的高效方法
在日常開發(fā)和工作中,我們可能要根據用戶上傳的文件做一系列的處理,本篇文章就以Excel表格文件為例,主要介紹了Spring?Boot?+?EasyExcel?+?SqlServer?進行批量處理數(shù)據的高效方法,需要的朋友可以參考下2024-06-06
Java微信公眾平臺開發(fā)(12) 微信用戶信息的獲取
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第十二步,微信用戶信息的獲取,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

