手机验证码登录,密码错误三次禁用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"); HashMapmap = 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","密码不一致"); } } }