Java后端圖形驗證碼的使用實例代碼
一、驗證碼使用邏輯

二、生成驗證碼
使用Kaptcha庫生成驗證碼
這里使用的是后端調(diào)用Kaptcha庫生成驗證碼的二進(jìn)制字符串,傳給前端,由前端轉(zhuǎn)為圖片
1、引入依賴
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
2、生成驗證碼
// 生成驗證碼 String code = kaptchaProducer.createText();
3、根據(jù)文本生成驗證碼圖片(BufferedImage對象)
BufferedImage kaptchaImage = kaptchaProducer.createImage(code);
4、將圖片轉(zhuǎn)換為Base64
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(kaptchaImage, "jpg", outputStream); String base64Img = Base64.getEncoder().encodeToString(outputStream.toByteArray());
ByteArrayOutputStream:內(nèi)存輸出流,用于臨時存儲圖片二進(jìn)制數(shù)據(jù)。
ImageIO.write:將BufferedImage以JPEG格式寫入輸出流。
Base64編碼:將二進(jìn)制圖片數(shù)據(jù)轉(zhuǎn)換為Base64字符串,便于前端通過直接顯示。
5、構(gòu)造返回前端的響應(yīng)
Map<String, String> imgMap = new HashMap<>(); imgMap.put(key, "data:image/jpeg;base64," + base64Img);
返回值格式:生成一個鍵值對,例如:
{ "captchaKey": "data:image/jpeg;base64,/9j/4AAQSkZJRgA..." }
key的作用:前端提交驗證碼時需攜帶此鍵,服務(wù)端通過它從緩存中獲取正確的驗證碼文本。
6、緩存驗證碼
Map<String, String> cacheMap = new HashMap<>(); cacheMap.put(CODE, code.toUpperCase()); captchaCache.putCaptcha(key, cacheMap);
Google Guava 緩存庫實現(xiàn)的驗證碼緩存組件,用于在單節(jié)點部署環(huán)境中存儲和驗證驗證碼信息。
- 轉(zhuǎn)換為大寫:code.toUpperCase()使驗證碼不區(qū)分大小寫(用戶輸入a3g7或A3G7均可通過)。
- 緩存邏輯:
- CODE是常量(如"code"),作為緩存Map的鍵。
- captchaCache是自定義緩存組件,將key與驗證碼文本關(guān)聯(lián),通常設(shè)置有效期
@Override
public boolean putCaptcha(String key, Map<String, String> value) {
try {
cache.put(key, JSONObject.fromObject(value).toString());
} catch (Exception ex) {
return false;
}
return true;
}
三、驗證驗證碼
一般在調(diào)用登錄接口前驗證驗證碼,通過SpringMVC的攔截器實現(xiàn)
1、驗證驗證碼,判斷是否為空
if(StringUtil.isEmpty(key)) {
throw new BadRequestAlertException(ErrorConstants.CAPTCHA_TYPE, "The information of captcha is missing", "captcha.header", "missing");
}
2、獲取驗證碼(如果驗證碼過期則無法獲取到)
Map<String, String> validateMap = captchaCache.getCaptcha(key);
3、刪除驗證碼緩存
captchaCache.deleteCaptcha(key);
4、比較驗證碼的值
if(captcha.get(CODE).equalsIgnoreCase(validateMap.get(CODE))){
return true;
}總結(jié)
到此這篇關(guān)于Java后端圖形驗證碼使用的文章就介紹到這了,更多相關(guān)Java后端圖形驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
autoMapping和autoMappingBehavior的區(qū)別及說明
這篇文章主要介紹了autoMapping和autoMappingBehavior的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Java中List與數(shù)組相互轉(zhuǎn)換實例分析
這篇文章主要介紹了Java中List與數(shù)組相互轉(zhuǎn)換的方法,實例分析了Java中List與數(shù)組相互轉(zhuǎn)換中容易出現(xiàn)的問題與相關(guān)的解決方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05
SpringBoot整合redis中的JSON序列化文件夾操作小結(jié)
在我們?nèi)粘5捻椖块_發(fā)中,使用redis作為緩存,來提高系統(tǒng)訪問速度和緩解系統(tǒng)壓力,在使用中遇到幾個問題,本文給大家詳細(xì)總結(jié)下,對SpringBoot整合redis?JSON序列化相關(guān)知識感興趣的朋友一起看看吧2022-02-02
一文詳解SpringBoot響應(yīng)壓縮功能的配置與優(yōu)化
Spring Boot的響應(yīng)壓縮功能基于智能協(xié)商機(jī)制,需同時滿足很多條件,本文主要為大家詳細(xì)介紹了SpringBoot響應(yīng)壓縮功能的配置與優(yōu)化,需要的可以參考下2025-03-03

