短信验证注册,一个完整而优雅的JAVA后端实现 您所在的位置:网站首页 java实现短信验证码 短信验证注册,一个完整而优雅的JAVA后端实现

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

2023-09-06 04:47| 来源: 网络整理| 查看: 265

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 **/ @Override public 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 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 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()); }

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有