SpringBoot實現(xiàn)分布式驗證碼登錄方案小結(jié)
在現(xiàn)代分布式系統(tǒng)中,登錄功能是系統(tǒng)安全的第一道防線。驗證碼登錄作為一種有效的防護手段,可以防止惡意gongji、暴力pojie等。然而,在分布式環(huán)境中,如何高效地管理驗證碼是一個值得深思的問題。本文將通過 SpringBoot 實現(xiàn)一個分布式驗證碼登錄方案,重點講解技術(shù)實現(xiàn)細節(jié)。
一、方案設(shè)計思路
驗證碼登錄的核心流程包括:
- 驗證碼生成與存儲:生成驗證碼并將其存儲到分布式緩存中,如 Redis。
- 驗證碼驗證:用戶提交驗證碼時,從緩存中取出比對。
- 分布式支持:通過 Redis 等分布式緩存組件,實現(xiàn)跨節(jié)點的數(shù)據(jù)共享。
流程圖
用戶請求驗證碼 -> 服務(wù)端生成驗證碼并存儲到 Redis -> 用戶輸入驗證碼登錄 -> 服務(wù)端校驗驗證碼 -> 登錄成功或失敗
二、項目依賴
在 SpringBoot 項目中添加以下依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> </dependencies>
Spring Web:用于構(gòu)建 RESTful 接口。
Spring Data Redis:用于操作 Redis。
Kaptcha:用于生成驗證碼。
三、具體實現(xiàn)
1. 配置 Redis
在 application.yml 中配置 Redis:
spring: redis: host: localhost port: 6379 password: timeout: 6000ms
2. 生成驗證碼
使用 Kaptcha 生成驗證碼。
引入配置類
import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; @Configuration public class KaptchaConfig { @Bean public DefaultKaptcha producer() { DefaultKaptcha kaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "no"); properties.setProperty("kaptcha.textproducer.font.color", "black"); properties.setProperty("kaptcha.textproducer.char.space", "5"); kaptcha.setConfig(new Config(properties)); return kaptcha; } }
驗證碼生成接口
import com.google.code.kaptcha.Producer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.UUID; import java.util.concurrent.TimeUnit; @RestController public class CaptchaController { @Autowired private Producer captchaProducer; @Autowired private StringRedisTemplate redisTemplate; @GetMapping("/captcha") public void getCaptcha(HttpServletResponse response) throws IOException { // 生成驗證碼文本 String captchaText = captchaProducer.createText(); // 生成唯一標識符 String captchaKey = UUID.randomUUID().toString(); // 將驗證碼存儲到 Redis,有效期 5 分鐘 redisTemplate.opsForValue().set(captchaKey, captchaText, 5, TimeUnit.MINUTES); // 將驗證碼圖片寫入響應(yīng) BufferedImage image = captchaProducer.createImage(captchaText); response.setContentType("image/jpeg"); response.setHeader("Captcha-Key", captchaKey); // 返回給客戶端,用于后續(xù)校驗 ImageIO.write(image, "jpeg", response.getOutputStream()); } }
3. 校驗驗證碼
登錄接口
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class LoginController { @Autowired private StringRedisTemplate redisTemplate; @PostMapping("/login") public String login(@RequestBody Map<String, String> request) { String captchaKey = request.get("captchaKey"); String captchaValue = request.get("captchaValue"); // 從 Redis 中獲取驗證碼 String correctCaptcha = redisTemplate.opsForValue().get(captchaKey); if (correctCaptcha == null) { return "驗證碼已過期,請重新獲??!"; } if (!correctCaptcha.equalsIgnoreCase(captchaValue)) { return "驗證碼錯誤!"; } // 驗證通過,刪除 Redis 中的驗證碼 redisTemplate.delete(captchaKey); return "登錄成功!"; } }
四、完整運行效果
- 用戶請求 /captcha 接口,返回驗證碼圖片和唯一標識符。
- 用戶輸入驗證碼后調(diào)用 /login 接口,提交驗證碼和標識符。
- 服務(wù)端驗證通過后返回登錄成功,否則提示失敗原因。
五、優(yōu)化建議
防暴力pojie:
對于同一 IP 多次錯誤嘗試,進行限制或封禁。
驗證碼復(fù)雜度:
增加驗證碼的字符長度或加入干擾線,提高pojie難度。
Redis 分布式支持:
使用 Redis 集群模式,提升可用性和擴展性。
六、總結(jié)
通過 SpringBoot 結(jié)合 Redis 和 Kaptcha,可以高效地實現(xiàn)分布式驗證碼登錄方案。這種方式不僅具有較高的安全性,還能很好地適配分布式系統(tǒng)需求。希望本文的講解能為大家在實際開發(fā)中提供幫助!
到此這篇關(guān)于SpringBoot實現(xiàn)分布式驗證碼登錄方案小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot分布式驗證碼登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+MyBatisPlus+MySQL8實現(xiàn)樹形結(jié)構(gòu)查詢
這篇文章主要為大家詳細介紹了SpringBoot+MyBatisPlus+MySQL8實現(xiàn)樹形結(jié)構(gòu)查詢,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06springboot?使用websocket技術(shù)主動給前端發(fā)送消息的實現(xiàn)
這篇文章主要介紹了springboot?使用websocket技術(shù)主動給前端發(fā)送消息的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12基于javaweb+jsp的游泳館會員管理系統(tǒng)(附源碼)
這篇文章主要介紹了基于javaweb+jsp的游泳館會員管理系統(tǒng),開發(fā)工具eclipse/idea/myeclipse/sts等均可配置運行,此源代碼社和課程設(shè)計,大作業(yè)及畢業(yè)設(shè)計項目,需要的朋友可以參考下2022-04-04利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程
大家應(yīng)該都知道Idea社區(qū)版本,默認是不能創(chuàng)建SpringBoot項目的,下面這篇文章主要給大家介紹了關(guān)于利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-04-04Java中的UrlDecoder 和 UrlEncoder_動力節(jié)點Java學(xué)院整理
HTML 格式編碼的實用工具類。該類包含了將 String 轉(zhuǎn)換為 application/x-www-form-urlencoded MIME 格式的靜態(tài)方法。下文通過實例代碼給大家介紹Java中的UrlDecoder 和 UrlEncoder知識,感興趣的的朋友一起看看吧2017-07-07Spring聲明式事務(wù)注解之@EnableTransactionManagement解析
這篇文章主要介紹了Spring聲明式事務(wù)注解之@EnableTransactionManagement解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java?代碼本地設(shè)置Hadoop用戶名密碼的方法
在Hadoop環(huán)境中,通常使用Kerberos進行身份驗證,這篇文章主要介紹了Java?代碼本地設(shè)置Hadoop用戶名密碼的方法,需要的朋友可以參考下2024-08-08SpringBoot文件上傳控制及Java 獲取和判斷文件頭信息
這篇文章主要介紹了SpringBoot文件上傳控制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-12-12