1.用户输入手机号获取验证码开始.

     说明一下,如果需要在获取手机号验证码之前进行一个图片滑块校验,参看前一篇博文
1.1前端获取数据封装类
@Data
public class NoteDTO extends InputObject {/*** 手机号*/private String UserAccount;/*** 短信验证码*/private String code;/*** 滑块校验的uuid*/private String uuid;/*** 滑块校验的横向滑动的参数*/private Integer moveEnd_X;
}
1.2 判断用户是否存在

这里把主要业务放进了controller层,望周知
首先对手机号判断数据库是否存在,也就是是否已经注册

/*** @return * @Author * @Description 校验该账户是否存在* @Date 9:38 2019/10/15* @Param [sportUserAccountVo]**/@PostMapping("/userExist")public OutputObject getVerificationCode(@RequestBody NoteDTO noteDTO) {//查询该账户是否存在UserInfoPo byUserAccount = userInfoService.findByUserAccount(noteDTO.getUserAccount());if (byUserAccount != null) {return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());}return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), new ArrayList());}

Service层

 /*** @Author * @Description * @Date 14:07 2019/10/14* @Param [sportUserAccountVo]* @return **/@Overridepublic UserInfoPo findByUserAccount(String userAccount) {//查出该用户的所有信息UserInfoPo userInfoPos = userInfoMapper.findUserInfoByUserAccount(userAccount);return userInfoPos;}

dao层 主要是普通的查询操作,在这里我解释一下OutPutObject是控制层的数据响应,也就是状态码,当然也可以是个对象。

    /*** @Author * @Description  * @Date 19:44 2019/10/14* @Param [userAccount]* @return **/UserInfoPo findUserInfoByUserAccount(@Param("userAccount") String userAccount);
1.3 发送短信验证码和校验验证码

这里的校验验证码单独分开来方便解耦,后面的很多操作都会用到这个校验功能,或者抽取一个工具类也是可以的。这里校验是在发送短信时我们在Redis中存入,验证时通过用户的标识,从Redis中取出来,相对比较安全的方式。

// An highlighted block
/*** @return com.deyi.govaffair.pojo.OutputObject* @Description 发送短信方法* @Param [noteDTO]**/@RequestMapping(value = "send", method = RequestMethod.POST)public OutputObject messageSend(@RequestBody NoteDTO noteDTO, HttpSession session) {//查询该账户是否存在UserInfoPo byUserAccount = userInfoService.findByUserAccount(noteDTO.getUserAccount());if (byUserAccount != null) {return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());}//从Session中获取uuid的值对应的裁剪横向距离int CJX = (int) session.getAttribute(noteDTO.getUuid());//用户拉取裁剪图片的横向距离int moveEnd_X = noteDTO.getMoveEnd_X();if (moveEnd_X > CJX - 10 && moveEnd_X < CJX + 10) {    //偏差在10之内System.out.println("拼接成功");//map.put("YZ", "1");LOGGER.info("发送短信:{}", noteDTO);if (EmptyUtil.isEmpty(noteDTO.getUserAccount())) {return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(), StatusCode.PHONE_NUMBER_IS_NULL.getMessage(), new ArrayList());}String code = RandomUtil.getRandom(4);//调用发送短信服务,发送成功之后存储到redis/** phoneNumber 手机号* verificationCode 验证码* expire过期时间(分钟)*/Map<String, String> map1 = new HashMap<>();map1.put("phoneNumber", noteDTO.getUserAccount());map1.put("verificationCode", code);map1.put("expire", "10");RongLianSmsSendUtils.sendVerificationCode(map1);redisManager.set(RedisPrefix.MESSAGE_CODE.getInfo() + noteDTO.getUserAccount(), code, 600);return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), 1);}return new OutputObject(StatusCode.FAIL.getCode(), StatusCode.FAIL.getMessage(), 0);}/*** 短信验证码验证接口* @param noteDTO* @return com.deyi.govaffair.pojo.OutputObject* @author 张汉飞* @date 2019-07-20 15:22:59*/@RequestMapping(value ="verification", method=RequestMethod.POST)public OutputObject messageSendVerification(@RequestBody NoteDTO noteDTO){if(EmptyUtil.isEmpty(noteDTO.getUserAccount())){return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(),StatusCode.PHONE_NUMBER_IS_NULL.getMessage(),new ArrayList());}if(EmptyUtil.isEmpty(noteDTO.getCode())){return new OutputObject(StatusCode.CODE_IS_NULL.getCode(),StatusCode.CODE_IS_NULL.getMessage(),new ArrayList());}Object redisMessageCode = redisManager.get(RedisPrefix.MESSAGE_CODE.getInfo() + noteDTO.getUserAccount());if(EmptyUtil.isNotEmpty(redisMessageCode) && redisMessageCode.equals(noteDTO.getCode())){return new OutputObject(StatusCode.SUCCESS.getCode(),StatusCode.SUCCESS.getMessage(),new ArrayList());}return new OutputObject(StatusCode.CODE_MISS.getCode(),StatusCode.CODE_MISS.getMessage(),new ArrayList());}
1.4当然前面的校验必须通过,接下来才是注册。

在这里我们不厌其烦的对验证码、用户账号、用户信息的校验当然是为了规范和安全。

/*** @return com.deyi.govaffair.pojo.OutputObject* @Description 用户注册接口* @Param [userInfoDTO]**/@PostMapping("register")public OutputObject register(@RequestBody UserInfoDTO userInfoDTO) {//判断用户名(手机号是否未空)if (EmptyUtil.isEmpty(userInfoDTO.getUserAccount())) {return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(), StatusCode.PHONE_NUMBER_IS_NULL.getMessage(), new ArrayList());}//查询该账户是否存在存在UserInfoPo byUserAccount = userInfoService.findByUserAccount(userInfoDTO.getUserAccount());if (byUserAccount != null) {return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());}if (EmptyUtil.isEmpty(userInfoDTO.getCode())) {return new OutputObject(StatusCode.CODE_IS_NULL.getCode(), StatusCode.CODE_IS_NULL.getMessage(), new ArrayList());}Object redisMessageCode = redisManager.get(RedisPrefix.MESSAGE_CODE.getInfo() + userInfoDTO.getUserAccount());//校验验证码if (EmptyUtil.isNotEmpty(redisMessageCode) && redisMessageCode.equals(userInfoDTO.getCode())) {//将验证码存储在redis中的前缀为 message:code: 的key批量删除redisManager.del(RedisPrefix.MESSAGE_CODE.getInfo() + userInfoDTO.getUserAccount());//执行保存操作OutputObject outputObject = userInfoService.saveUserInfo(userInfoDTO);return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), new ArrayList());}return new OutputObject(StatusCode.CODE_MISS.getCode(), StatusCode.CODE_MISS.getMessage(), new ArrayList());}

其中的持久层和业务层只是简单的展示,主要是对数据库的查,增相信对大家都是便饭,思路讲清楚,具体的大家应该都能实现。

短信验证注册,一个完整而优雅的JAVA后端实现相关推荐

  1. 简单实现短信验证注册功能

    短信验证注册 短信验证码发送操作逻辑: ​ 1>点击获取验证码按钮发送短信到注册那个手机号码上 ​ 2>注册手机收到短信验证码,并输入 ​ 3>低级注册携带短信验证码,判断验证码是否 ...

  2. java实现阿里云短信验证注册--详细教程

    java实现阿里云短信验证注册–详细教程 .项目中先引入依赖 <!--阿里云短信包--><dependency><groupId>com.aliyun</gr ...

  3. Java使用网易云信短信验证 demo(完整教程)

    大概流程: 用户输入账号点击获取验证码,验证是否绑定手机号码,绑定则发送验证码 用户输入验证码,调用接口验证是否正确返回响应 首先我们需要在网易云信注册账号,获取得到App Key和App Secre ...

  4. C# - RestSharp实现短信验证码注册登录完整示例

    这次给大家介绍C# - RestSharp实现短信验证功能的方法,由于,短信验证码是现在不可或缺的一种身份验证方式,所以,就来看看通过C#通过RestSharp的方式实现验证功能,下面就以云市场服务商 ...

  5. laravel 整合 云之讯短信验证注册

    SDK下载地址: http://docs.ucpaas.com/doku.php?id=sms_sdk 首先把 Ucpaas.class.php文件放在根目录app/common/sms/lib/下 ...

  6. Luffy之注册认证(容联云通讯短信验证)

    用户的注册认证 前端显示注册页面并调整首页头部和登陆页面的注册按钮的链接. 注册页面Register,主要是通过登录页面进行改成而成. 先构造前端页面 <template><div ...

  7. Android之Mob第三方短信验证服务

    目录 mob简单介绍 前期准备 2.1注册登录 2.2创建应用 2.3下载sdk 2.4引入sdK 调用有界面接口 3.1效果图 3.2配置AndroidManifest.xml 3.3添加代码 调用 ...

  8. springboot中实现短信验证(从零开始、腾讯云)

    前言 最近由于毕业设计需要,打算使用短信验证注册和登录,所以特地查了一下一些常用的短信验证接口:阿里云.腾讯云.由于阿里云审核过于麻烦,所以使用了腾讯云,注册个公众号就可以啦! 第一步:注册公众号 1 ...

  9. Android手机短信验证--Bmob短信验证

    在Android项目中,用户注册的时候一般都会用到手机短信验证,最近使用了Bmob的短信验证,感觉还行,这里推荐给大家使用,下面是使用的方法: 1.注册一个Bmob账号 注册成功之后,按照开发文档一步 ...

最新文章

  1. log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?
  2. 基于matlab fdma传输系统设计,基于MATLAB的LTE系统仿真研究
  3. BZOJ Tyvj 1729 文艺平衡树
  4. MySQL密码设置和重置,以及远程登入数据库
  5. ad 原理图差分线_采用差分PulSAR ADC AD7982转换单端信号电路图
  6. Java设计模式之行为型:解释器模式
  7. 进程间通信 - 匿名管道实现
  8. SAP Spartacus core模块的单元测试
  9. PHP函数之HTMLSPECIALCHARS_DECODE
  10. 计算机房防火要求,信息机房如何进行防火设计
  11. python导入数据画柱状图代码_在Linux下使用Python的matplotlib绘制数据图的教程
  12. 机器学习(周志华)——决策树问题
  13. SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
  14. 关于Firefox OS的陈述
  15. 单元格自适应宽度_Excel – 合并单元格时,如何同时保留每个单元格的内容?...
  16. APP运营中地推应该怎么做
  17. centos 7.x 安装python 3.6 并创建虚拟环境
  18. 云原生Tekton之触发器Trigger
  19. limit 后注入_聊一聊 SQLMAP 在进行 sql 注入时的整个流程
  20. canvas -小球自由落体运动

热门文章

  1. MarkdownPad的安装,打开.md文件
  2. Laravel文档梳理6、响应
  3. 大疆图像算法面试流程
  4. 52brain公众号目录【2020年3月】
  5. 北斗导航 | ARAIM算法初探:使用精密单点定位(PPP)技术的ARAIM:解分离
  6. 等保三级网络安全相关设备加固笔记
  7. c# 计算圆锥的体积_急求用c#计算圆柱体和圆锥体的体积的代码,下面是要求:...
  8. LaTeX之双栏模板表格布局(单双栏满宽+不满宽)
  9. Linux下安装新世纪五笔输入法(附表)(for 小白)
  10. linux icc编译器,icc编译器