文章目录
详解方案一:基于kaptcha的图形验证码实现步骤
方案二:基于短信验证码实现步骤
方案三:基于Spring Mail的邮箱验证码实现步骤
方案四:基于AJ-Captcha的滑动拼图验证码实现步骤
总结
详解
在Web应用中,验证码是防止恶意登录、暴力破解等安全威胁的重要手段。SpringBoot提供了多种验证码实现方式,本文将介绍4种常见的登录验证码方案,包括:
基于kaptcha的图形验证码(传统字符验证)基于短信验证码(手机号+短信验证)基于Spring Mail的邮箱验证码(邮箱+验证码)基于AJ-Captcha的滑动拼图验证码(行为验证)
每种方案均提供核心实现思路,帮助开发者快速集成到项目中。
方案一:基于kaptcha的图形验证码
适用场景:传统Web登录,适用于PC端,防止自动化脚本攻击。
实现步骤
引入依赖(Maven)
配置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(以阿里云为例)
发送短信验证码
@Service
public class SmsService {
public void sendSms(String phone, String code) {
// 调用阿里云/腾讯云短信API
System.out.println("发送短信验证码:" + code + " 至 " + phone);
}
}
存储验证码(Redis推荐)
@Autowired
private 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的滑动拼图验证码
适用场景:防机器人攻击,提升用户体验(无感验证)。
实现步骤
引入依赖
配置AJ-Captcha(application.yml)
aj:
captcha:
type: blockPuzzle # 滑动拼图
cache-type: redis # 存储方式
前端集成(HTML + JS)
new AjCaptcha("#captcha", {
verify: function(data) {
// 提交验证数据到后端
fetch("/verify-captcha", {
method: "POST",
body: JSON.stringify(data)
});
}
});
后端校验
@PostMapping("/verify-captcha")
public boolean verifyCaptcha(@RequestBody CaptchaVO data) {
return captchaService.verification(data);
}
总结
方案适用场景优点缺点kaptchaPC端传统登录简单易用可能被OCR破解短信验证码手机号登录安全性高依赖短信服务商,有成本邮箱验证码邮箱注册/找回密码无额外费用依赖邮件服务器AJ-Captcha防机器人攻击用户体验好需要前端适配
开发者可根据业务需求选择合适的验证码方案,甚至组合使用(如“图形+短信”双重验证)。
源码示例:GitHub链接
希望本文对您有所帮助!欢迎留言讨论。 🚀