SpringBoot中4种登录验证码实现方案

SpringBoot中4种登录验证码实现方案

文章目录

详解方案一:基于kaptcha的图形验证码实现步骤

方案二:基于短信验证码实现步骤

方案三:基于Spring Mail的邮箱验证码实现步骤

方案四:基于AJ-Captcha的滑动拼图验证码实现步骤

总结

详解

在Web应用中,验证码是防止恶意登录、暴力破解等安全威胁的重要手段。SpringBoot提供了多种验证码实现方式,本文将介绍4种常见的登录验证码方案,包括:

基于kaptcha的图形验证码(传统字符验证)基于短信验证码(手机号+短信验证)基于Spring Mail的邮箱验证码(邮箱+验证码)基于AJ-Captcha的滑动拼图验证码(行为验证)

每种方案均提供核心实现思路,帮助开发者快速集成到项目中。

方案一:基于kaptcha的图形验证码

适用场景:传统Web登录,适用于PC端,防止自动化脚本攻击。

实现步骤

引入依赖(Maven)

com.github.penggle

kaptcha

2.3.2

配置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(以阿里云为例)

com.aliyun

aliyun-java-sdk-core

4.5.3

发送短信验证码

@Service

public class SmsService {

public void sendSms(String phone, String code) {

// 调用阿里云/腾讯云短信API

System.out.println("发送短信验证码:" + code + " 至 " + phone);

}

}

存储验证码(Redis推荐)

@Autowired

private RedisTemplate 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的滑动拼图验证码

适用场景:防机器人攻击,提升用户体验(无感验证)。

实现步骤

引入依赖

com.anji-plus

aj-captcha-springboot-starter

1.3.0

配置AJ-Captcha(application.yml)

aj:

captcha:

type: blockPuzzle # 滑动拼图

cache-type: redis # 存储方式

前端集成(HTML + JS)

后端校验

@PostMapping("/verify-captcha")

public boolean verifyCaptcha(@RequestBody CaptchaVO data) {

return captchaService.verification(data);

}

总结

方案适用场景优点缺点kaptchaPC端传统登录简单易用可能被OCR破解短信验证码手机号登录安全性高依赖短信服务商,有成本邮箱验证码邮箱注册/找回密码无额外费用依赖邮件服务器AJ-Captcha防机器人攻击用户体验好需要前端适配

开发者可根据业务需求选择合适的验证码方案,甚至组合使用(如“图形+短信”双重验证)。

源码示例:GitHub链接

希望本文对您有所帮助!欢迎留言讨论。 🚀

相关推荐

ASP技术现在还有人在用吗?
外围365bet网址

ASP技术现在还有人在用吗?

📅 07-24 👁️ 6109
笔记本电源适配器坏了怎么办?15个实用维修步骤详解
webform 最后的黄昏之力
外围365bet网址

webform 最后的黄昏之力

📅 07-17 👁️ 2090