Java后端圖形驗(yàn)證碼的使用實(shí)例代碼
一、驗(yàn)證碼使用邏輯
二、生成驗(yàn)證碼
使用Kaptcha庫生成驗(yàn)證碼
這里使用的是后端調(diào)用Kaptcha庫生成驗(yàn)證碼的二進(jìn)制字符串,傳給前端,由前端轉(zhuǎn)為圖片
1、引入依賴
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
2、生成驗(yàn)證碼
// 生成驗(yàn)證碼 String code = kaptchaProducer.createText();
3、根據(jù)文本生成驗(yàn)證碼圖片(BufferedImage對(duì)象)
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)存輸出流,用于臨時(shí)存儲(chǔ)圖片二進(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);
返回值格式:生成一個(gè)鍵值對(duì),例如:
{ "captchaKey": "data:image/jpeg;base64,/9j/4AAQSkZJRgA..." }
key的作用:前端提交驗(yàn)證碼時(shí)需攜帶此鍵,服務(wù)端通過它從緩存中獲取正確的驗(yàn)證碼文本。
6、緩存驗(yàn)證碼
Map<String, String> cacheMap = new HashMap<>(); cacheMap.put(CODE, code.toUpperCase()); captchaCache.putCaptcha(key, cacheMap);
Google Guava 緩存庫實(shí)現(xiàn)的驗(yàn)證碼緩存組件,用于在單節(jié)點(diǎn)部署環(huán)境中存儲(chǔ)和驗(yàn)證驗(yàn)證碼信息。
- 轉(zhuǎn)換為大寫:code.toUpperCase()使驗(yàn)證碼不區(qū)分大小寫(用戶輸入a3g7或A3G7均可通過)。
- 緩存邏輯:
- CODE是常量(如"code"),作為緩存Map的鍵。
- captchaCache是自定義緩存組件,將key與驗(yàn)證碼文本關(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; }
三、驗(yàn)證驗(yàn)證碼
一般在調(diào)用登錄接口前驗(yàn)證驗(yàn)證碼,通過SpringMVC的攔截器實(shí)現(xiàn)
1、驗(yàn)證驗(yàn)證碼,判斷是否為空
if(StringUtil.isEmpty(key)) { throw new BadRequestAlertException(ErrorConstants.CAPTCHA_TYPE, "The information of captcha is missing", "captcha.header", "missing"); }
2、獲取驗(yàn)證碼(如果驗(yàn)證碼過期則無法獲取到)
Map<String, String> validateMap = captchaCache.getCaptcha(key);
3、刪除驗(yàn)證碼緩存
captchaCache.deleteCaptcha(key);
4、比較驗(yàn)證碼的值
if(captcha.get(CODE).equalsIgnoreCase(validateMap.get(CODE))){ return true; }
總結(jié)
到此這篇關(guān)于Java后端圖形驗(yàn)證碼使用的文章就介紹到這了,更多相關(guān)Java后端圖形驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過JDBC連接oracle數(shù)據(jù)庫的十大技巧
通過JDBC連接oracle數(shù)據(jù)庫的十大技巧...2006-12-12Mybatis-Plus中update()和updateById()將字段更新為null
本文主要介紹了Mybatis-Plus中update()和updateById()將字段更新為null,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08SpringBoot中HTTP請(qǐng)求不通的原因級(jí)解決方法
HTTP 請(qǐng)求是指從客戶端到服務(wù)器的請(qǐng)求消息,對(duì)于一個(gè) Spring Boot 項(xiàng)目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會(huì)遇到SpringBoot HTTP請(qǐng)求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下2025-02-02解決idea的debug模式突然變卡,項(xiàng)目啟動(dòng)變慢的狀況
這篇文章主要介紹了解決idea的debug模式突然變卡,項(xiàng)目啟動(dòng)變慢的狀況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02IntelliJ IDEA像Eclipse一樣打開多個(gè)項(xiàng)目的圖文教程
這篇文章主要介紹了IntelliJ IDEA像Eclipse一樣打開多個(gè)項(xiàng)目的方法圖文教程講解,需要的朋友可以參考下2018-03-03詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐
在 Web 開發(fā)中, 我們經(jīng)常會(huì)需要處理各種異常,這篇文章主要介紹了詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01