通过Redis实现手机验证码

随机生成验证码的方法

// 随机生成验证码的方法
    private String getCode(int len) {
        String code = "";
        for (int i = 0; i < len; i++) {
            int rand = new Random().nextInt(10);
            code += rand;
        }
        return code;
    }

获取当天剩余秒数的方法

//获取当天剩余秒数的方法
    private long getTheLeftSeconds(){
        //获取现在的时间
        LocalTime now = LocalTime.now();
        //获取当日23点59分59秒的时间
        LocalTime end = LocalTime.of(23, 59, 59);
        //获取end与now相差的秒数
        long millis = Duration.between(now, end).toMillis()/1000;
        return millis;
    }

1.输入手机号,点击发送后随机生成6位数字码,2分钟有效

相关代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户的手机号
        String phoneNo = request.getParameter("phone_no");
        //判断用户的手机号是否为空
        if(phoneNo == null || "".equals(phoneNo)){
            return;
        }
        //获取验证码
        String code = getCode(6);
        //拼接向Redis中保存的验证码的key,必须保证唯一性
        String phoneKey = phoneNo + ":code";
        //向redis中保存验证码,时效为120秒
        jedis.setex(phoneKey,120,code);
        //给前台响应一个true
        response.getWriter().write("true");
        //关闭jedis
        jedis.close();
    }

2.输入验证码,点击验证,返回成功或失败

相关代码:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取用户输入的手机号和验证码
        String phoneNo = request.getParameter("phone_no");
        String verify_code = request.getParameter("verify_code");
        //验空
        if(phoneNo == null | verify_code == null | "".equals(phoneNo) | "".equals(verify_code)){
            return;
        }
        String phoneKey = phoneNo + ":code";
        //连接Linux上的redis
        Jedis jedis = new Jedis("192.168.6.165", 6379);
        //获取redis中的value值
        String phoneValue = jedis.get(phoneKey);
        if(verify_code.equals(phoneValue)){
            //如果验证码和redis中的验证码一样,使用后删除redis中的验证码
            jedis.del(phoneKey);
            //向前台响应为true
            response.getWriter().write("true");
        }
        jedis.close();
    }

3.每个手机号每天只能发送3次验证码

相关代码:

        //获取用户的手机号
        String phoneNo = request.getParameter("phone_no");
        //判断用户的手机号是否为空
        if(phoneNo == null || "".equals(phoneNo)){
            return;
        }
        //拼接向redis中保存发送验证码的次数的计数器的key
        String countKey = phoneNo + ":count";
        //连接linux上的redis
        Jedis jedis = new Jedis("192.168.6.165",6379);
        //向redis中获取计数器的值
        String count = jedis.get(countKey);
        //判断计数器的值是否为空
        if(count == null){
            //证明该手机号今日还没有发送过验证码
            //获取今日剩余的秒数
            long theLeftSeconds = getTheLeftSeconds();
            //向redis中保存一个计数器,并设置它的值为1,有效时间为当日剩余的时间
            jedis.setex(countKey,(int)theLeftSeconds,"1");
        }else if("3".equals(count)){
            //证明今日发送超过次数,向前台响应limit
            response.getWriter().write("limit");
            //关闭jedis
            jedis.close();
            return;
        }else {
            //证明今日发送还未超过3次,计数器的值加1即可
            jedis.incr(countKey);
        }

整合后的代码:

发送验证码的代码:

//处理发送验证码的Servlet
@WebServlet("/SendCodeServlet")
public class SendCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户的手机号
        String phoneNo = request.getParameter("phone_no");
        //判断用户的手机号是否为空
        if(phoneNo == null || "".equals(phoneNo)){
            return;
        }
        //拼接向redis中保存发送验证码的次数的计数器的key
        String countKey = phoneNo + ":count";
        //连接linux上的redis
        Jedis jedis = new Jedis("192.168.6.165",6379);
        //向redis中获取计数器的值
        String count = jedis.get(countKey);
        //判断计数器的值是否为空
        if(count == null){
            //证明该手机号今日还没有发送过验证码
            //获取今日剩余的秒数
            long theLeftSeconds = getTheLeftSeconds();
            //向redis中保存一个计数器,并设置它的值为1,有效时间为当日剩余的时间
            jedis.setex(countKey,(int)theLeftSeconds,"1");
        }else if("3".equals(count)){
            //证明今日发送超过次数,向前台响应limit
            response.getWriter().write("limit");
            //关闭jedis
            jedis.close();
            return;
        }else {
            //证明今日发送还未超过3次,计数器的值加1即可
            jedis.incr(countKey);
        }
        //获取验证码
        String code = getCode(6);
        //拼接向Redis中保存的验证码的key,必须保证唯一性
        String phoneKey = phoneNo + ":code";
        //向redis中保存验证码,时效为120秒
        jedis.setex(phoneKey,120,code);
        //给前台响应一个true
        response.getWriter().write("true");
        //关闭jedis
        jedis.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    // 随机生成验证码的方法
    private String getCode(int len) {
        String code = "";
        for (int i = 0; i < len; i++) {
            int rand = new Random().nextInt(10);
            code += rand;
        }
        return code;
    }

    //获取当天剩余秒数的方法
    private long getTheLeftSeconds(){
        //获取现在的时间
        LocalTime now = LocalTime.now();
        //获取当日23点59分59秒的时间
        LocalTime end = LocalTime.of(23, 59, 59);
        //获取end与now相差的秒数
        long millis = Duration.between(now, end).toMillis()/1000;
        return millis;
    }
}

验证验证码的代码:

//处理验证验证码请求的Servlet
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取用户输入的手机号和验证码
        String phoneNo = request.getParameter("phone_no");
        String verify_code = request.getParameter("verify_code");
        //验空
        if(phoneNo == null || verify_code == null || "".equals(phoneNo) || "".equals(verify_code)){
            return;
        }
        String phoneKey = phoneNo + ":code";
        //连接Linux上的redis
        Jedis jedis = new Jedis("192.168.6.165", 6379);
        //获取redis中的value值
        String phoneValue = jedis.get(phoneKey);
        if(verify_code.equals(phoneValue)){
            //如果验证码和redis中的验证码一样,使用后删除redis中的验证码
            jedis.del(phoneKey);
            //向前台响应为true
            response.getWriter().write("true");
        }
        jedis.close();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值