<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
<version>2.11.1version>
dependency>
<dependency>
<groupId>io.lettucegroupId>
<artifactId>lettuce-coreartifactId>
<version>6.3.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.6version>
dependency>
dependencies>
spring:
data:
redis:
host: your_redis_host
port: your_redis_port # 通常为6379
password: your_redis_password
lettuce:
pool:
max-active: 8 # 最大连接数
max-idle: 8 # 最大空闲连接数
min-idle: 0 # 最小空闲连接数
max-wait: 100 # 连接等待时间
mail:
host: smtp.qq.com
port: 465
username: [email protected]
password: 111 # 输入 QQ 邮箱的授权码
properties:
mail:
smtp:
ssl:
enable: true # QQ 邮箱需要开启 SSL
auth: true
使用 Redis 缓存验证码并实现验证码的校验功能:
@Service
public class CaptchaService {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 生成验证码
* @param email 目标邮箱
* @return 生成的验证码
*/
public String generateCaptcha(String email) {
// 生成验证码
String code = RandomStringUtils.randomNumeric(6);
redisTemplate.opsForValue().set(
"CAPTCHA:" + email,
code,
Duration.ofMinutes(5) // 验证码有效期为5分钟
);
return code;
}
/**
* 验证码校验
* @param email 邮箱
* @param code 验证码
* @return 是否验证通过
*/
public boolean validateCaptcha(String email, String code) {
String captcha = redisTemplate.opsForValue().get("CAPTCHA:" + email);
return captcha != null && captcha.equals(code);
}
}
@Service
public class EmailService {
@Autowired
private JavaMailSender mailSender;
/**
* 发送验证码邮件
* @param email 收件人邮箱
* @param authCode 验证码
*/
public void sendCaptchaEmail(String email, String authCode) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("[email protected]");
message.setTo(email);
message.setSubject("验证码");
message.setText("您的验证码是:" + authCode + ",有效期为5分钟");
mailSender.send(message);
}
}
@RestController
public class AuthController {
@Autowired
private UserService userService;
@Autowired
private CaptchaService captchaService;
@Autowired
private EmailService emailService;
/**
* 注册接口
* @param userDTO 用户信息
* @param captcha 验证码
* @return 注册结果
*/
@PostMapping("/register")
public Result register(@RequestBody UserDTO userDTO, @RequestParam String captcha) {
if (!captchaService.validateCaptcha(userDTO.getEmail(), captcha)) {
return Result.error("验证码错误");
}
userService.register(userDTO);
return Result.success();
}
/**
* 登录接口
* @param userDTO 用户信息
* @return 登录结果
*/
@PostMapping("/login")
public Result login(@RequestBody UserDTO userDTO) {
User user = userService.login(userDTO);
if (user == null) {
return Result.error("用户不存在");
}
// 登录成功,生成 JWT 令牌
Map<String, Object> claims = new HashMap<>();
claims.put("userId", user.getId());
String token = JwtUtils.createJWT("secretKey", 60000, claims);
UserVO userVO = new UserVO();
BeanUtils.copyProperties(user, userVO);
LoginResponse loginResponse = new LoginResponse(userVO, token);
return Result.success(loginResponse);
}
/**
* 发送验证码接口
* @param email 邮箱地址
* @return 发送结果
*/
@PostMapping("/send-code")
public Result sendCode(@RequestParam String email) throws MessagingException {
// 校验邮箱格式
if (!RegexUtils.isEmailValid(email)) {
return Result.error("邮箱格式非法");
}
String code = captchaService.generateCaptcha(email);
emailService.sendCaptchaEmail(email, code);
return Result.success();
}
}
/send-code
接口获取验证码。/register
接口进行注册。