项目第九天
项目需求
手机端的快速登录功能的实现
采用阿里云的短信服务功能,redis存贮数据可以设置消亡时间来对验证码进行一个有效时长的一个绑定
1、快速登录的实现
- 前端进行手机号的输入,手机号要进行正则表达式校验,获取验证码(后端接收到这个请求后,通过阿里云发送验证码,并将该验证码存入redis数据库中)
- 前端进行登录操作,后端,通过手机号在redis中查找到发送的验证码,与前端用户输入的验证码进行比较,相同就通过,登录成功,否则就失败
- 如果不存在这样的手机号用户,就自动注册用户信息
- 补充:为解决不断发送登录请求信息以及密码黑客破解登录,进行一下操作;设置登录次数,r通过redis保存登录次数,当登录错误数超过3次时,进行账号锁定,该账号就无法进行再登录,必须等到多少分钟后可以再次登录。
- 登录密码设置:对密码进行加盐加密处理,加盐即在密码前面加上一串随机的数据,后面接上密码
前端代码
1 <script> 2 var vue = new Vue({ 3 el:'#app', 4 data:{ 5 loginInfo:{}//登录信息 6 }, 7 methods:{ 8 //发送验证码 9 sendValidateCode(){ 10 //获取手机号 11 let telephone = this.loginInfo.telephone; 12 //手机号校验 13 if (!checkTelephone(telephone)) { 14 this.$message.error('请输入正确的手机号'); 15 return false; 16 } 17 validateCodeButton = $("#validateCodeButton")[0]; 18 clock = window.setInterval(doLoop, 1000); //一秒执行一次 19 axios.post("/validateCode/send4Login.do?telephone=" + telephone).then((response) => { 20 if(!response.data.flag){ 21 //验证码发送失败 22 this.$message.error('验证码发送失败,请检查手机号输入是否正确'); 23 } 24 }); 25 }, 26 //登录 27 login(){ 28 let telephone = this.loginInfo.telephone; 29 //校验手机号 30 if (!checkTelephone(telephone)) { 31 this.$message.error('请输入正确的手机号'); 32 return false; 33 } 34 if (this.loginInfo.validateCode==null){ 35 this.$message.error('验证码不能为空'); 36 return false; 37 } 38 axios.post("/member/login.do",this.loginInfo).then((res) => { 39 if(res.data.flag){ 40 //登录成功,跳转到index.html 41 window.location.href="/pages/index.html"; 42 }else{ 43 //失败,提示失败信息 44 this.$message.error(res.data.message); 45 } 46 }); 47 } 48 } 49 }); 50 </script>
后端代码
1 @RestController 2 @RequestMapping("/member") 3 public class MemberController { 4 @Autowired 5 private JedisPool jedisPool; 6 @Reference 7 private MemberService memberService; 8 9 @RequestMapping("/login") 10 public Result login(@RequestBody Map map, HttpServletResponse response) { 11 Jedis resource = jedisPool.getResource(); 12 //获取前台的验证码 13 String telephone = (String) map.get("telephone"); 14 String validateCode = (String) map.get("validateCode"); 15 try { 16 //获取存入redis中的验证码 17 String validateCodeInRedis = resource.get(telephone + RedisMessageConstant.SENDTYPE_LOGIN); 18 if (validateCode != null && validateCodeInRedis != null && validateCodeInRedis.equals(validateCode)) { 19 //判断当前账号是不是会员账号 20 Member member = memberService.findByTelephone(telephone); 21 22 if (member == null) {//如果不是会员,注册会员 23 member=new Member(); 24 member.setRegTime(new Date()); 25 member.setFileNumber(telephone); 26 memberService.add(member); 27 } 28 29 //将手机号做为cookie存入客户端 30 Cookie cookie = new Cookie("login_member_telephone", telephone); 31 cookie.setPath("/"); 32 cookie.setMaxAge(60 * 60 * 24 * 30);//设置cookie为一个月 33 //将会员信息保存到redis,以手机号为主键,存储的时间为1小时 34 String memberJson = JSON.toJSON(member).toString(); 35 resource.setex(telephone, 60 * 30, memberJson); 36 37 return new Result(true, MessageConstant.LOGIN_SUCCESS); 38 } else { 39 //验证码输入错误 40 return new Result(false, MessageConstant.VALIDATECODE_ERROR); 41 } 42 }catch (Exception e){ 43 e.getStackTrace(); 44 return new Result(true,"...................."); 45 }finally { 46 resource.close(); 47 } 48 } 49 }