认证服务:验证码保存和注册

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 认证服务:验证码保存和注册

ThirdPartFeignService

调用第三方服务发送信息

1. @FeignClient("gulimall-third-party")
2. public interface ThirdPartFeignService {
3. @GetMapping("/sms/sendcode")
4. public R sendCode(@RequestParam("phone") String phone, @RequestParam("code") String code);
5. 
6. }

 

sendCode

//60s内不能再发

//验证码校验redis    存key-phone value-code  sms:code:13104928451->5379

//rdis缓存验证码,防止同一个phone在60s内再次发送验证码

1. @ResponseBody
2. @GetMapping("/sms/sendcode")
3. public R sendCode(@RequestParam("phone") String phone){
4. String redisCode = redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);
5. if(!StringUtils.isEmpty(redisCode)){
6. long l = Long.parseLong(redisCode.split("_")[1]);
7. if(System.currentTimeMillis()-l<60000){
8. //60s内不能再发
9. return  R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(), BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());
10.           }
11.       }
12. 
13. //todo 接口防刷
14. 
15. //验证码校验redis    存key-phone value-code  sms:code:13104928451->5379
16. 
17. String code = UUID.randomUUID().toString().substring(0, 5)+"_"+System.currentTimeMillis();
18. //rdis缓存验证码,防止同一个phone在60s内再次发送验证码
19.         redisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone,code,10, TimeUnit.MINUTES);
20. 
21.         thirdPartFeignService.sendCode(phone,code);
22. return  R.ok();
23.     }

UserRegisteVo

接收前端传入的注册信息

1. @Data
2. public class UserRegisteVo {
3. @NotEmpty(message = "用户名必须提交")
4. @Length(min = 6,max = 18,message = "用户名必须是6-18位字符")
5. private  String userName;
6. 
7. @NotEmpty(message = "密码必须填写")
8. @Length(min = 6,max = 18,message = "密码必须是6-18位字符")
9. private  String password;
10. 
11. @NotEmpty(message = "手机号必须填写")
12. @Pattern(regexp = "^[1]([3-9]{9}$)",message = "手机号格式不正确")
13. private  String phone;
14. 
15. @NotEmpty(message = "验证码必须填写")
16. private  String code;
17. 
18. }

 

regist

* //todo 重定向携带数据,利用session原理,将数据放在session中
* 重要跳到下一个页面取出这个数据以后,session里面的数据就会删掉
*
* //todo 分布式下的session问题
//重定向中保存数据
redirectAttributes.addFlashAttribute("errors",errors);
//校验出错,转到注册页
//Request method 'POST' not supported
//用户注册->/regist[post]--->转发/reg.html(路径映射默认都是get方式进行访问的.)

 

1. @PostMapping("/regist")
2. public String regist(@Valid UserRegisteVo vo, BindingResult result, RedirectAttributes redirectAttributes){
3. if (result.hasErrors()){
4.             Map<String,String> errors=new HashMap<>();
5.             result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
6. //重定向中保存数据
7.             redirectAttributes.addFlashAttribute("errors",errors);
8. //校验出错,转到注册页
9. //Request method 'POST' not supported
10. //用户注册->/regist[post]--->转发/reg.html(路径映射默认都是get方式进行访问的.)
11. 
12. return  "redirect:http://auth.gulimall.com/reg.html";
13.         }
14. //真正的注册
15. //1.校验验证码
16. String code = vo.getCode();
17. String s = redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + vo.getPhone());
18. if(!StringUtils.isEmpty(s)){
19. if(code.equals(s)){
20. if(code.equals( s.split("_")[0])){
21. //验证码通过
22. 
23. 
24. //删除验证码
25.                    redisTemplate.delete(AuthServerConstant.SMS_CODE_CACHE_PREFIX+vo.getPhone());
26. 
27.                }else {
28.                    HashMap<String, String> errors = new HashMap<>();
29.                    errors.put("code","验证码错误");
30.                    redirectAttributes.addFlashAttribute("errord",errors);
31. return  "redirect:http://auth.gulimall.com/reg.html";
32.                }
33.             }
34.         }else{
35.             HashMap<String, String> errors = new HashMap<>();
36.             errors.put("code","验证码错误");
37.             redirectAttributes.addFlashAttribute("errord",errors);
38. return  "redirect:http://auth.gulimall.com/reg.html";
39.         }
40. 
41. //注册成功返回到登录页
42. return  "redirect:/login.html";
43.     }

 

前端

 

<div class="tips" style="color: red" th:text="${errors != null ? (#maps.containsKey(errors, 'userName') ? errors.userName : '') : ''}">
<div class="tips" style="color: red" th:text="${errors != null ? (#maps.containsKey(errors, 'password') ? errors.password : '') : ''}">
<div class="tips" style="color: red" th:text="${errors != null ? (#maps.containsKey(errors, 'phone') ? errors.phone : '') : ''}">
<div class="tips" style="color: red" th:text="${errors != null ? (#maps.containsKey(errors, 'code') ? errors.code : '') : ''}">


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
NoSQL Java Redis
认证服务---整合短信验证码,验证码倒计时,验证码防刷校验 【一】
这篇文章介绍了如何在分布式微服务项目中整合短信验证码服务,包括使用阿里云短信验证接口、将短信验证功能集成到第三方服务中、其他服务的远程调用,以及通过Redis实现验证码防刷机制的代码实现和遇到的问题解决方案。
|
8月前
|
数据采集 安全 容灾
《阿里云产品手册2022-2023 版》——号码认证服务
《阿里云产品手册2022-2023 版》——号码认证服务
123 0
|
移动开发 API 开发工具
秒懂云通信:如何使用阿里云号码认证服务(小白指南)
手把手教你如何使用阿里云号码认证服务,超详细控制台步骤解析,快速上手!
3131 0
秒懂云通信:如何使用阿里云号码认证服务(小白指南)
|
安全 数据安全/隐私保护 开发者
阿里云通信发布全新号码认证服务, 重新定义手机号码认证的方式
12月12日,阿里云通信宣布号码认证服务正式商用,将重新定义手机号码认证的方式。因移动应用实名制的政策要求,手机号码认证在移动APP的注册、登录等场景用的越来越多。而对于开发者来说,能完成手机号码认证的选择并不多,一般是借助短信、语音的基础通信通道,自己实现短信验证码或语音验证码来实现。
25102 0
|
8月前
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
6月前
jcaptcha集群时验证码不能验证的问题
jcaptcha集群时验证码不能验证的问题
69 3
|
11月前
|
安全 Java 数据库
SpringSecurity实现多种登录方式,如邮件验证码、电话号码登录
SpringSecurity实现多种登录方式,如邮件验证码、电话号码登录
1892 2
|
数据安全/隐私保护
认证服务:注册和登录
认证服务:注册和登录
下一篇
oss创建bucket