手机验证码登录,密码错误三次禁用3分钟


1.前言

  需要注册榛子云短信平台,这是一个对于普通程序员比较友好的平台,注册登录后免费赠送一条短信,建议充值20元,

  最全短信接口 短信平台 短信验证码接口-榛子云短信官网 (zhenzikj.com)

  1.1:充值

   1.2:查看关键参数

    2:准备依赖文件

        2.1:在pom.xml中加入依赖


        
            com.zhenzikj
            zhenzisms
            2.0.2
        

        2.2:工具类

public class Verification {
  // 参数依次为 手机号 验证码 时间
public static String verification(String telephone, Integer code, Integer time) {
     //此处 的Appid 和AppSecret 为上面我标记的两个参数 ZhenziSmsClient client
= new ZhenziSmsClient("https://sms_developer.zhenzikj.com", "AppId", "AppSecret"); HashMap map = new HashMap(); map.put("number", telephone);
      //此处为短信模板id map.put(
"templateId", "模板id"); String[] templateParams = new String[]{code + "", time + ""}; map.put("templateParams", templateParams); String result = null; try { result = client.send(map); } catch (Exception var8) { var8.printStackTrace(); } return result; } }

      2.3:前端,点击发送验证码,开始简单倒计时60秒,并在此期间禁用获取验证码按钮。

      

        2.4:前端JavaScript代码

 //发送验证码
        function sendCode() {
            let telephone = $.trim($("[name='telephone']").val());
            //进行发送验证码之前,先进行非空验证
            if(null!=telephone && telephone!=""){
                $.post("sendCode",{telephone:telephone},function (obj) {
                    let num=60;
                    let interval = setInterval(function (){
                        num--;
                        if(num>0){
                            $("#code").text(num+"秒后过期");
                            $("[name='hq']").prop("disabled",true);
                        }else{
                            $("#code").text("请重试");
                            $("[name='hq']").prop("disabled",false);
                            clearInterval(interval)
                        }
                    },1000)
                })
            }

        }

     2.5:后端获取验证码方法,手机接收验证码进行验证登录,

@ResponseBody
    @RequestMapping("/sendCode")
    public void sendCode(String telephone){
        int code = (int)(Math.random()*999999);
        redisTemplate.opsForValue().set("login"+telephone,code+"",1, TimeUnit.MINUTES);
        //调用工具类 发送手机验证码
        String verification = Verification.verification(telephone, code, 1);
        System.out.println("返回状态:"+verification);
        System.out.println(telephone+":验证码:"+code);
    }

    2.6:登录验证,并且记录密码失败次数,进行禁用此账户三分钟 

      2.6.1:前端  

//登录
        function toLogin() {
            //登录之前先进行非空验证
            //
            let falg = true;
            let telephone = $("[name='telephone']").val();
            let password = $("[name='password']").val();
            let code = $("[name='code']").val();
            if(null==telephone || telephone==""){
                $("#telephone").text("不能为空");
                falg = false;
            }else{
                let tele = /^136[1-9]{8}$/;
                if(!tele.test(telephone)){
                    $("#telephone").text("手机号格式不正确");
                    falg = false;
                }
            }
            if(null==password || password==""){
                $("#password").text("不能为空");
                falg = false;
            }
            if(null==code || code==""){
                $("#code").text("不能为空");
                falg = false;
            }
            if(falg){
                $.post("login",$("form").serialize(),function (obj){
                    if(obj.code_auth==201 || obj.code_auth==200){
                        alert(obj.message);
                        location="list";
                    }else{
                        alert(obj.message);
                    }
                })
            }
        }

        2.6.2:后端

@ResponseBody
    @RequestMapping("/login")
    public ReturnMessage toLogin(User user,String code){
        //由于前端已经确定非空,所以此时属性一定不为空,只需要判断对错即可
        String code_auth = (String) redisTemplate.opsForValue().get("login" + user.getTelephone());
        if(!code.equals(code_auth)){
            return new ReturnMessage("202","验证码错误");
        }
        //获取密码错误次数,如果错误超过三次 则禁用3分钟
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("fail" + user.getTelephone(), 0,1,TimeUnit.DAYS);
        int failNum = 0;
        if(!aBoolean){
            //不成功 则说明已经错误过
            failNum = (int) redisTemplate.opsForValue().get("fail" + user.getTelephone());
            if(failNum==3){
                redisTemplate.opsForValue().set("fail" + user.getTelephone(),failNum,3,TimeUnit.MINUTES);
                return new ReturnMessage("203","账号被禁用"+redisTemplate.getExpire("fail" + user.getTelephone())+"后登录");
            }
        }
        //验证码正确  根据电话查询用户是否存在
        User user1 = userService.showUser(user.getTelephone());
        if(null==user1){
            //没有这个用户,则一定是新用户
            userService.addUser(user);
            //删除 失败次数key
            redisTemplate.delete("fail" + user.getTelephone());
            return new ReturnMessage("201","新用户登录成功");
        }else{
            //不为空 进行密码判断 是否正确
            if(user.getPassword().equals(user1.getPassword())){
                //一致  登陆成功
                return new ReturnMessage("200","用户登录成功");
            }else{
                //不一致
                redisTemplate.opsForValue().set("fail" + user.getTelephone(),(failNum+1));
                return new ReturnMessage("202","密码不一致");
            }
        }
    }