简单实验,没有考虑并发
一、案例要求
-
根据手机号生成6位验证码,2分钟有效。且2分钟之内不可再次生成验证码。
-
每个手机号每天只能输入3次。
二、实验环境准备
2.1 修改redis网络配置
修改redis配置文件,redis.conf
- 注释掉:bind 127.0.0.1
- 解开注释:requirepass 密码
2.2 关闭防火墙或打开redis端口号
- 关闭防火墙:systemctl stop firewalld
- 开通redis端口号:firewall-cmd --zone=public --add-port=6739/tcp --permanent
2.3 相关依赖导入
<!-- 生成随机数工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
三、具体实现
3.1 成员变量
Jedis jedis=new Jedis("192.168.100.103",6379);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
3.2 生成验证码
//生成验证码并输出
public void getCode(String phone){
try
{
jedis.auth("123456");
//1.判断手机号2分钟内是否已发送验证码:phone:String 存在验证码
String hasCode = jedis.get(phone);
if(hasCode!=null){
System.out.println("发送验证码繁忙,请两分钟后再试!");
return;
}
//2.判断该手机号今天发送次数是否超过3次:yyyy-MM-dd-code:map 存储今天验证码发送次数
String isOut = jedis.hget(simpleDateFormat.format(new Date()) + "-code", phone);
if(isOut!=null && isOut.equals("3")){
System.out.println("发送验证码频繁,请明天再试!");
return;
}
//3.该手机号发送次数加1。(有需要可判断该key是否存在,不存在则设置过期时间为一天。)
jedis.hincrBy(simpleDateFormat.format(new Date()) + "-code",phone,1);
//4.随机生成6位验证码,设置过期时间为2分钟
String random = RandomStringUtils.randomNumeric(6);
jedis.setex(phone,120,random);
System.out.println(phone+"的验证码为:"+random);
}finally {
jedis.close();
}
}
3.3 验证
public void testCode(String phone,String code){
try{
jedis.auth("123456");
//1.通过手机号获得验证码:phone:String
String s = jedis.get(phone);
//2.判断验证码是否正确
if(code.equals(s)){
System.out.println("验证成功!");
return;
}
System.out.println("验证失败!");
}finally {
jedis.close();
}
}
四、测试
代码
@Test
public void demo1(){
getCode("1111");
}
@Test
public void demo2(){
testCode("1111","706526");
}
输出
1111的验证码为:706526
验证成功!