文章目录
- 详解
- 方案一:基于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链接
希望本文对您有所帮助!欢迎留言讨论。 🚀