需求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次
实现代码
1.建立连接池
package com.ssm.pool;
/**
* @Author hjh
* @Date 2022/8/16 18:10
* @Description
*/
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 连接池
*/
public class Pools {
public static JedisPool getConn(){
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(32);
poolConfig.setMaxWaitMillis(100*1000);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setTestOnBorrow(true);
//创建连接池
JedisPool pool=new JedisPool(poolConfig,"192.168.121.12",6379);
//从连接池中获取连接资源
/* Jedis jedis = pool.getResource();*/
return pool;
}
public static void getClose(Jedis jedis){
jedis.close();
}
}
2.使用key实现
public static void main(String[] args) {
String code="";
Jedis jedis = Pools.getConn().getResource();
Scanner sc=new Scanner(System.in);
System.out.println("请输入手机号:");
String pnum = sc.nextLine();
String countKey="count"+pnum+"key";
String codeKey="code"+pnum+"key";
System.out.println("扣1,发送验证码");
int n1 = sc.nextInt();
if(n1!=1){
System.out.println("指令有误,请重新输入");
n1 = sc.nextInt();
}
/**
* 在生成验证码之前先判断这是第几次请求的验证码,小于三次通过,大于三则提示信息
*/
String count = jedis.get(countKey);
if(count==null){
jedis.setex(countKey, 24*60*60, "1");
}else if(Integer.parseInt(count)<=2){
jedis.incr(countKey);
}else if(Integer.parseInt(count)>2){
System.out.println("今天已经三次了,明天再试吧");
Pools.getClose(jedis);
return;
}
//输入手机号-->存储
Random random=new Random();
/**
* 生成验证码,并将验证码加入到redis
*/
int num=0;
for(int i=0;i<6;i++){
num = random.nextInt(10);
code+=num;
}
jedis.setex("codeKey", 120, code);
System.out.println("您的验证码为:"+code+",不要告诉其他人,两分钟内有效!");
System.out.println("请输入验证码:");
String pcode = sc.next();
if(pcode.equals(code)){
System.out.println("成功");
}else {
/**
* 一个手机号错误三次,今天不能在在获取
*/
System.out.println("您有三次错误机会");
System.out.println("输入错误");
}
3.使用hash实现
下面展示一些 内联代码片
。
使用hash只实现了获取三次验证码,但是对于验证码的时效性没有实现,hash里没有对应的方法(求指导!!!!!!)
package com.ssm.controller;
import com.ssm.pool.Pools;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
/**
* @Author hjh
* @Date 2022/8/16 19:34
* @Description
*/
public class LoginController {
/*
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次
*/
public static void main(String[] args) {
String code="";
Jedis jedis = Pools.getConn().getResource();
/*String ping = jedis.ping();
System.out.println(ping);*/
/*Map map=new HashMap<String,String>();
map.put("code",code);
map.put("count",count);*/
Scanner sc=new Scanner(System.in);
System.out.println("请输入手机号:");
String pnum = sc.nextLine();
/*jedis.hset("pnum");*/
System.out.println("扣1,发送验证码");
int n1 = sc.nextInt();
if(n1!=1){
System.out.println("指令有误,请重新输入");
n1 = sc.nextInt();
}
/**
* 在生成验证码之前先判断这是第几次请求的验证码,小于三次通过,大于三则提示信息
*/
int a=0;
String countKey="count"+(a++);
String count = jedis.hget(pnum, countKey);
if(count==null){
jedis.hset(pnum, countKey, "1");
}else if(Integer.parseInt(count)<=2){
jedis.hincrBy(pnum, countKey,1);
}else if(Integer.parseInt(count)>2){
System.out.println("已经三次了,明天再来试试");
Pools.getClose(jedis);
return;
}
//输入手机号-->存储
Random random=new Random();
/**
* 生成验证码,并将验证码加入到redis
*/
int num=0;
for(int i=0;i<6;i++){
num = random.nextInt(10);
code+=num;
}
//jedis.expire("code", 120);
jedis.hset(pnum, "code",code);
System.out.println("您的验证码为:"+code+",不要告诉其他人,两分钟内有效!");
System.out.println("请输入验证码:");
String pcode = sc.next();
if(pcode.equals(code)){
System.out.println("成功");
}else {
/**
* 一个手机号错误三次,今天不能在在获取
*/
System.out.println("您有三次错误机会");
System.out.println("输入错误,请重新输入");
}
}
}