使用Redis实现简单的登录验证码小案例

需求:

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("输入错误,请重新输入");
            }

    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点份炸鸡778

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值