以下是一个使用Spring Boot发送短信验证码,并结合Redis实现发送频率限制,验证码有效期为2分钟的示例代码。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
public class SmsController {
private static final String PHONE_PREFIX = "sms:phone:";
private static final long VALID_PERIOD = 2L; // 验证码有效期(分钟)
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private SmsService smsService; // 短信服务接口
// 发送短信验证码
@GetMapping("/sms/send")
public String sendSms(@RequestParam("phone") String phone) {
// 限制发送频率
if (redisTemplate.hasKey(PHONE_PREFIX + phone)) {
return "发送过于频繁,请稍后再试";
}
// 生成验证码
String verificationCode = generateVerificationCode();
// 发送短信
boolean sendResult = smsService.sendSms(phone, verificationCode);
if (sendResult) {
// 存储验证码到Redis,并设置过期时间
redisTemplate.opsForValue().set(PHONE_PREFIX + phone, verificationCode, VALID_PERIOD, MINUTES);
return "验证码已发送";
} else {
return "短信发送失败";
}
}
// 验证短信验证码
@GetMapping("/sms/verify")
public String verifySms(@RequestParam("phone") String phone, @RequestParam("code") String code) {
String storedCode = redisTemplate.opsForValue().get(PHONE_PREFIX + phone);
boolean verified = storedCode != null && storedCode.equals(code);
if (verified) {
// 验证码正确,可以执行后续操作
return "验证成功";
} else {
return "验证失败或验证码已过期";
}
}
private String generateVerificationCode() {
// 这里可以实现验证码的生成逻辑
return "123456"; // 示例代码中使用固定的验证码
}
}
在这个例子中,我们定义了sendSms
接口用于发送短信验证码,并在发送前检查是否超出了发送频率限制。验证码和手机号码作为键存储在Redis中,并设置有效期。verifySms
接口用于验证用户输入的验证码。这个简单的示例展示了如何在实际应用中结合Redis实现短信验证码的发送和验证。