需求
- 输入手机号,点击发送后随机生成6位数字码,2分钟有效
- 输入验证码,点击验证,返回成功或失败
- 每个手机号每天只能输入3次
实现思路
在redis中设置两个字符串类型的数据:
- 手机号为键,验证码为值,并设置过期时间为2分钟。
- 手机号+当前年月日为键,次数为值。实现每日三次次数
验证时取出redis中的验证码与自己输入的验证码对比。
实现代码
发送验证码:
/**
* 发送验证码
* @param phone
*/
public static void sendCode(String phone,Jedis jedis){
Random random = new Random();
String timeKey = phone+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
Boolean exists = jedis.exists(timeKey);
if (!exists){
jedis.set(timeKey,"0");
}
Integer time = Integer.parseInt(jedis.get(timeKey));
if (time >= 3){
System.out.println("该号码每日发送验证码次数已达上限。");
return;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 6; i++) {
sb.append(random.nextInt(10));
}
String code = sb.toString();
time += 1;
jedis.mset(phone,code,timeKey,time.toString());
// 设置验证码过期时间为两分钟
jedis.expire(phone,120);
//
System.out.println("您的验证码为:"+code+"、有效时间为两分钟!!!");
}
验证验证码
/**
* 验证验证码
* @param phone
*/
public static void checkCode(String phone,Jedis jedis){
Scanner scanner = new Scanner(System.in);
// 获取验证码
String code = jedis.get(phone);
// 验证输入的验证码是否正确
if (code != null){
if (code.equals(scanner.next().trim())){
System.out.println("验证通过!");
}else {
System.out.println("验证码错误!");
}
}else {
System.out.println("验证码已过期!!");
}
}
测试:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Jedis jedis = new Jedis("XXX.XXX.XXX.XXX",6379);
System.out.println(jedis.ping());
sendCode("XXXXXXXX",jedis);
checkCode("XXXXXXXX",jedis);
jedis.close();
}
结果: