验证码测试
验证结果:
验证结果将显示在这里...
Java 核心代码
验证码服务类
import org.springframework.stereotype.Service;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
/**
* 手机验证码服务
*/
@Service
public class SmsCodeService {
// 存储验证码,key: 手机号, value: 验证码和过期时间
private final ConcurrentHashMap<String, CodeInfo> codeCache =
new ConcurrentHashMap<>();
// 验证码有效期(分钟)
private static final int CODE_EXPIRE_MINUTES = 5;
// 验证码长度
private static final int CODE_LENGTH = 6;
// 发送间隔(秒)
private static final int SEND_INTERVAL_SECONDS = 60;
/**
* 生成验证码
*/
public String generateCode() {
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < CODE_LENGTH; i++) {
sb.append(random.nextInt(10));
}
return sb.toString();
}
/**
* 发送验证码
*/
public boolean sendCode(String phone) {
// 检查发送频率
if (isTooFrequent(phone)) {
return false;
}
// 生成验证码
String code = generateCode();
// 存储验证码信息
CodeInfo codeInfo = new CodeInfo(code,
System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(CODE_EXPIRE_MINUTES));
codeCache.put(phone, codeInfo);
// 记录发送时间
recordSendTime(phone);
// 调用短信服务发送验证码(这里模拟发送)
return sendSms(phone, code);
}
/**
* 验证验证码
*/
public boolean verifyCode(String phone, String inputCode) {
CodeInfo codeInfo = codeCache.get(phone);
if (codeInfo == null) {
return false; // 验证码不存在
}
// 检查是否过期
if (System.currentTimeMillis() > codeInfo.getExpireTime()) {
codeCache.remove(phone); // 移除过期验证码
return false;
}
// 验证码是否正确
if (codeInfo.getCode().equals(inputCode)) {
codeCache.remove(phone); // 验证成功后移除验证码
return true;
}
return false;
}
/**
* 检查发送频率
*/
private boolean isTooFrequent(String phone) {
// 实现发送频率检查逻辑
// 这里简化实现,实际应该存储发送时间并检查
return false;
}
/**
* 记录发送时间
*/
private void recordSendTime(String phone) {
// 记录发送时间,用于频率控制
}
/**
* 发送短信(模拟实现)
*/
private boolean sendSms(String phone, String code) {
// 这里模拟发送短信
System.out.println("发送短信到 " + phone + ": 验证码是 " + code);
// 实际项目中这里会调用短信服务商的API
// 例如阿里云短信服务、腾讯云短信服务等
return true;
}
/**
* 验证码信息类
*/
private static class CodeInfo {
private final String code;
private final long expireTime;
public CodeInfo(String code, long expireTime) {
this.code = code;
this.expireTime = expireTime;
}
public String getCode() {
return code;
}
public long getExpireTime() {
return expireTime;
}
}
}