1.短信发送
首先我们平时使用短信验证信息的时候一般都是这样的表单,首先需要我们用户输入手机号码,然后点击获取验证码按钮,这时候获取验证码的按钮需要请求我们的后端接口并携带用户的手机号给后端
2.后端接收到手机号并发送验证码
public boolean sendCode(String mobile) {if(redisLock.tryLock("sdfsdf", 50)) {try {String authCode = String.valueOf(getRandNum(1, 999999));System.out.println(authCode);log.info("测试验证码:"+authCode);myRedis.set(mobile, authCode, 300);boolean f = sendAuthCode(mobile, authCode);return f;}finally {redisLock.unlock("sdfsdf");}}throw new ApiException("操作頻繁", 500);}
(1)首先使用
String authCode = String.valueOf(getRandNum(1, 999999));
生成6位数的验证码然后把生成的验证码存入dedis中, myRedis.set(mobile, authCode, 300);
redis的key是用户的手机号码,value是生成的验证码,并设置该验证码只在redis中存在300秒
(2)然后调用发送短信的方法或者接口,我这里把发送短信的方法封装成了sendAuthCode(mobile,authCode)方法,这一步完成了向用户手机发送验证码的步骤。
注意提醒:这里需要使用redisLock来对发送验证码的进行相应的限制,第一个验证码发送之后的50秒内不允许再次发送验证码。
这时候就有人会有疑问了,这样是不是多此一举,前端的发送验证码的按钮一般都会有倒计时60秒的功能,60秒之内是变成灰色,不让用户点击的。后端用lock的目的就是为了防止有心之人恶意调取我们的接口。
3.接收验证码并验证
当我们前端的用户填写好了验证码之后,http请求需要把我们用户的手机号码+验证码发送到我们的后端
@RequestMapping(value = "/checkSetMeal.json", method = RequestMethod.POST, consumes = Constants.APPLICATION_JSON, produces = Constants.APPLICATION_JSON)public ApiResult<Map<String, Object>> checkSetMeal(@RequestBody HandleDTO handleDTO) {Map<String, String> map = new HashMap<String, String>();map = handleDTO.getContractInfo();String _code_ = map.get("_code_");String _name_mobile_ = map.get("_name_mobile_");if (_code_!=null&&_code_!=""&&_name_mobile_!=null&&_name_mobile_!="") {String redisCode = redis.get(_name_mobile_);if (_code_ != null && !"".equals(_code_)) {if (_code_.equals(redisCode)) {redis.del(_name_mobile_);return doCheckSetMeal(handleDTO, CmmcSource.OLD_PLATFORM.getType());}return ApiResult.fail("验证码错误", 403);}return ApiResult.fail("验证码错误", 403);}return doCheckSetMeal(handleDTO, CmmcSource.OLD_PLATFORM.getType());}
我们先获取验证码和手机号码,首先判断两个是否为空,若为空则执行其他代码,若不为空,则需要进行短信验证码的验证工作。
首先我们需要从redis中取出之前存入的验证码,String redisCode = redis.get(_name_mobile_);
然后从redis中取出的验证码和用户输入的验证码进行核对,若核对正确则需要把在redis中的验证码删除redis.del(_name_mobile_).
总结:
我们会发现验证码的发送、验证,在逻辑上没有上面困难点。
不过我们还需注意一下几点:
1.前面的redislock的运用,保证我们短信发送接口的安全。
2.Redis来储存验证码,验证码需要在300秒之后自动删除
3.接收前端传来的手机号和验证码之后需要取出Redis中的验证码
4.若短信验证成功,则需要注销该手机号对应的验证码 在Redis中存储的结构为
PhoneNumber--code 就是Redis中的Key-value
关于Redis的使用请关注我的下一篇博客