文章目錄
- 詳解
- 方案一:基于kaptcha的圖形驗證碼
- 實現步驟
- 方案二:基于短信驗證碼
- 實現步驟
- 方案三:基于Spring Mail的郵箱驗證碼
- 實現步驟
- 方案四:基于AJ-Captcha的滑動拼圖驗證碼
- 實現步驟
- 總結
詳解
在Web應用中,驗證碼是防止惡意登錄、暴力破解等安全威脅的重要手段。SpringBoot提供了多種驗證碼實現方式,本文將介紹4種常見的登錄驗證碼方案,包括:
- 基于kaptcha的圖形驗證碼(傳統字符驗證)
- 基于短信驗證碼(手機號+短信驗證)
- 基于Spring Mail的郵箱驗證碼(郵箱+驗證碼)
- 基于AJ-Captcha的滑動拼圖驗證碼(行為驗證)
每種方案均提供核心實現思路,幫助開發者快速集成到項目中。
方案一:基于kaptcha的圖形驗證碼
適用場景:傳統Web登錄,適用于PC端,防止自動化腳本攻擊。
實現步驟
-
引入依賴(Maven)
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
-
配置Kaptcha(
application.yml
或Java Config)@Configuration public class KaptchaConfig { @Bean public DefaultKaptcha kaptcha() { DefaultKaptcha kaptcha = new DefaultKaptcha(); Properties props = new Properties(); props.put("kaptcha.border", "no"); props.put("kaptcha.textproducer.font.color", "black"); props.put("kaptcha.textproducer.char.space", "4"); Config config = new Config(props); kaptcha.setConfig(config); return kaptcha; } }
-
生成驗證碼接口
@RestController public class CaptchaController { @Autowired private DefaultKaptcha kaptcha; @GetMapping("/captcha") public void captcha(HttpServletResponse response) throws IOException { String text = kaptcha.createText(); BufferedImage image = kaptcha.createImage(text); // 存儲到Session或Redis response.setContentType("image/jpeg"); OutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); out.flush(); } }
-
登錄時校驗驗證碼
@PostMapping("/login") public String login(@RequestParam String captcha, HttpSession session) { String storedCaptcha = (String) session.getAttribute("captcha"); if (!captcha.equalsIgnoreCase(storedCaptcha)) { return "驗證碼錯誤!"; } // 繼續登錄邏輯... }
方案二:基于短信驗證碼
適用場景:移動端登錄、手機號注冊,依賴短信服務商(如阿里云、騰訊云)。
實現步驟
-
引入短信SDK(以阿里云為例)
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency>
-
發送短信驗證碼
@Service public class SmsService { public void sendSms(String phone, String code) { // 調用阿里云/騰訊云短信API System.out.println("發送短信驗證碼:" + code + " 至 " + phone); } }
-
存儲驗證碼(Redis推薦)
@Autowired private RedisTemplate<String, String> redisTemplate; public void saveSmsCode(String phone, String code) { redisTemplate.opsForValue().set("sms:" + phone, code, 5, TimeUnit.MINUTES); }
-
登錄時校驗短信驗證碼
@PostMapping("/sms-login") public String smsLogin(@RequestParam String phone, @RequestParam String code) { String storedCode = redisTemplate.opsForValue().get("sms:" + phone); if (!code.equals(storedCode)) { return "短信驗證碼錯誤!"; } // 登錄邏輯... }
方案三:基于Spring Mail的郵箱驗證碼
適用場景:郵箱注冊、找回密碼,適用于企業郵箱或個人郵箱。
實現步驟
-
配置Spring Mail(
application.yml
)spring: mail: host: smtp.163.com username: your-email@163.com password: your-password default-encoding: UTF-8
-
發送郵件驗證碼
@Service public class EmailService { @Autowired private JavaMailSender mailSender; public void sendEmailCode(String email, String code) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(email); message.setSubject("您的驗證碼"); message.setText("驗證碼:" + code + ",5分鐘內有效"); mailSender.send(message); } }
-
存儲驗證碼(Redis)
redisTemplate.opsForValue().set("email:" + email, code, 5, TimeUnit.MINUTES);
-
登錄校驗
@PostMapping("/email-login") public String emailLogin(@RequestParam String email, @RequestParam String code) { String storedCode = redisTemplate.opsForValue().get("email:" + email); if (!code.equals(storedCode)) { return "郵箱驗證碼錯誤!"; } // 登錄邏輯... }
方案四:基于AJ-Captcha的滑動拼圖驗證碼
適用場景:防機器人攻擊,提升用戶體驗(無感驗證)。
實現步驟
-
引入依賴
<dependency> <groupId>com.anji-plus</groupId> <artifactId>aj-captcha-springboot-starter</artifactId> <version>1.3.0</version> </dependency>
-
配置AJ-Captcha(
application.yml
)aj: captcha: type: blockPuzzle # 滑動拼圖 cache-type: redis # 存儲方式
-
前端集成(HTML + JS)
<script src="https://cdn.jsdelivr.net/npm/aj-captcha"></script> <div id="captcha"></div> <script> new AjCaptcha("#captcha", { verify: function(data) { // 提交驗證數據到后端 fetch("/verify-captcha", { method: "POST", body: JSON.stringify(data) }); } }); </script>
-
后端校驗
@PostMapping("/verify-captcha") public boolean verifyCaptcha(@RequestBody CaptchaVO data) { return captchaService.verification(data); }
總結
方案 | 適用場景 | 優點 | 缺點 |
---|---|---|---|
kaptcha | PC端傳統登錄 | 簡單易用 | 可能被OCR破解 |
短信驗證碼 | 手機號登錄 | 安全性高 | 依賴短信服務商,有成本 |
郵箱驗證碼 | 郵箱注冊/找回密碼 | 無額外費用 | 依賴郵件服務器 |
AJ-Captcha | 防機器人攻擊 | 用戶體驗好 | 需要前端適配 |
開發者可根據業務需求選擇合適的驗證碼方案,甚至組合使用(如“圖形+短信”雙重驗證)。
源碼示例:GitHub鏈接
希望本文對您有所幫助!歡迎留言討論。 🚀