当前位置:网站首页>25:第三章:开发通行证服务:8:【注册/登录】接口:接收并校验“手机号和验证码”参数;(重点需要知道【利用redis来暂存数据,获取数据的】的应用场景)(使用到了【@Valid注解】参数校验)
25:第三章:开发通行证服务:8:【注册/登录】接口:接收并校验“手机号和验证码”参数;(重点需要知道【利用redis来暂存数据,获取数据的】的应用场景)(使用到了【@Valid注解】参数校验)
2022-06-30 19:33:00 【小枯林】
说明:
(1)本篇博客内容:开始开发【一键注册/登录】接口;
● 然后,本篇博客开发的部分是:用户在点击【一键注册/登录】按钮后,后端会校验【用户是否输入了手机号或验证码】、【用户输入的验证码是否匹配】;
(2)本篇博客的需要注意的点:
● 创建了BO实体类,去承接前端表单提交的数据;
● 使用了【@Valid注解】参数校验;
● 一些公用的方法,可以定义在【imooc-news-dev-service-api】接口工程的BaseController类中;
● 注意一下参数校验的整体流程;
目录
1.在【imooc-news-dev-service-api】接口工程的PassportControllerApi接口中,定义【注册/登录】接口;
2.在【imooc-news-dev-service-user】用户微服务的PassportController类中,实现【注册/登录】接口;
1.在【imooc-news-dev-service-api】接口工程的PassportControllerApi接口中,定义【注册/登录】接口;
/** * 【一键注册/登录,接口】 * @param registLoginBo * @param result * @return */ @ApiOperation(value = "一键注册/登录接口", notes = "一键注册/登录接口", httpMethod = "POST") //前端那边的请求接口已经是“getSMSCode”了,所以自己在写后端接口的url的时候,别瞎写; @PostMapping("/doLogin") public GraceJSONResult doLogin(@RequestBody @Valid RegistLoginBo registLoginBo, BindingResult result);说明:
(1)接口请求方式是POST,因为前端其实是一个表单,而对应表单提交一般都使用POST方式;
(2)一般来说,接收表单数据的时候,我们可以使用对象去承接参数;
● 所以我们在【imooc-news-dev-model】模型工程中,创建bo包,创建RegistLoginBo实体类;(BO的意思是,从页面视图层传过来的对象,也可以理解为是Bussiness Object)(在本项目中,BO实体类是前端传给后端的,VO实体类是后端传给前端的)
package com.imooc.bo; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * BO实体类:承接【一键注册/登录】接口的参数; */ public class RegistLoginBo { @NotBlank(message = "手机号不能为空") private String mobile; @NotBlank(message = "短信验证码不能为空") private String smsCode; public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getSmsCode() { return smsCode; } public void setSmsCode(String smsCode) { this.smsCode = smsCode; } @Override public String toString() { return "RegistLoginBo{" + "mobile='" + mobile + '\'' + ", smsCode='" + smsCode + '\'' + '}'; } }● 这儿使用到了【@Valid注解】参数校验;可以参考【Spring Boot电商项目24:商品分类模块三:使用【@Valid注解】校验入参;】;
● 其中【@NotNull】注解,只能校验完全为空的情况,如果前端输入一个如【" "】的空字符串,该注解是校验不了的;;;而【@NotBlank】注解不仅可以校验完全为空的情况,也可以校验如【" "】的空字符串;
● 然后,记得在接口的RegistLoginBo参数那儿,要使用【@Valid】注解,以开启参数校验;
● 如果我们在实体类上使用lombok的注解后,就可以省略get和set方法等;;;但是,很多公司是不建议使用lombok的(因为其在与某些第三方库结合的时候,可能会有一些小bug)
● 然后,如果我们使用bean去接收参数的时候,需要使用【@RequestBody】注解;;;这个注解的主要意思是【前端传过来的JSON】和【后面的RegistLoginBo registLoginBo】是对应的,以便承接参数;
● 一旦校验失败,有错误信息后,我们就可以通过【BindingResult result】来获取对应的错误信息;所以,这儿在参数中,也引入了【BindingResult result】;
● 这儿的内容,以前遇到过N次,也不是特别复杂,就不过多赘述了;
2.在【imooc-news-dev-service-user】用户微服务的PassportController类中,实现【注册/登录】接口;
/** * 【一键注册/登录,接口】 * @param registLoginBo * @param result * @return */ @Override public GraceJSONResult doLogin(@Valid RegistLoginBo registLoginBo, BindingResult result) { //0.判断BindingResult中是否保存了验证失败的错误信息,如果有,说明前端的输入是有问题的(手机号或者验证码,至少有一个没输入); // 那么,我们就获取这个错误信息,并构建一个GraceJSONResult统一返回对象,返回; if (result.hasErrors()) { Map<String, String> map = getErrorsFromBindingResult(result); return GraceJSONResult.errorMap(map); } //1.校验验证码是否匹配; //1.1 获取用户在前端输入的手机号和验证码; String mobile = registLoginBo.getMobile(); String smsCode = registLoginBo.getSmsCode(); //1.2 根据用户在前端输入的手机号,尝试去redis中获取对应的验证码; String redisSMSCode = redisOperator.get(MOBILE_SMSCODE + ":" + mobile); //1.3如果前端输入的验证码,在redis中不存在(说明:我们并没有针对【用户输入的这个手机号码】发送过验证码; // 或者说是用户在收到验证码短信后,过了30min后才使用,redis中存的验证码过期失效了), // 或者前端输入的验证码和redis中的不一样(说明:用户的验证码输错了); // 那么,就返回对应的,包含错误信息的GraceJSONResult统一返回对象; // 其中,这儿我们利用【org.apache.commons.lang3】中的StringUtils工具类的isBlank()方法来判空; if (StringUtils.isBlank(redisSMSCode) || !redisSMSCode.equals(smsCode)) { return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR); } return GraceJSONResult.ok(); }说明:
(1)判断【参数校验】是否OK;
● 我们在【imooc-news-dev-service-api】接口工程的BaseController中,定义了一个方法getErrorsFromBindingResult():从BindingResult中提取错误信息;(这个方法,以后在其他地方,也会被用到)
(2)校验验证码是否匹配;
● 说明1;
● 说明2;
3.效果;
(1)全局install一下整个项目;
(2)启动【imooc-news-dev-service-usr】用户微服务的主启动类;
(3)我们在【http://localhost:8003/doc.html】Swagger2的页面上,去测试接口了;
● 失败的情况;
● OK的情况;
边栏推荐
- 8 - function
- 正则系列之字符类
- The former king of fruit juice sold for 1.6 billion yuan
- 企业中台规划和IT架构微服务转型
- VR云展厅如何给线下实体带来活力?有哪些功能?
- neo4j load csv 配置和使用
- 4.3-inch touch screen 12 channel control port programmable network central control supports mutual backup of 5 central control hosts
- 【论文阅读】Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline
- Is it safe to open an account for mobile phone stock trading!?
- Go language learning tutorial (13)
猜你喜欢
随机推荐
英语没学好到底能不能做coder,别再纠结了先学起来
Spark - 一文搞懂 Partitioner
启动PHP报错ERROR: [pool www] cannot get uid for user ‘@[email protected]’
ABAQUS 2022最新版——完善的现实仿真解决方案
FH6908A负极关断同步整流模拟低压降二极管控制IC芯片TSOT23-6超低功耗整流器 1w功耗 <100uA静态 替代MP6908
pycharm有用快捷键
The prospectus of pelt medical was "invalid" for the second time in the Hong Kong stock exchange, and the listing plan was substantially delayed
Which brokerage has the lowest commission? In addition, is it safe to open a mobile account?
盘点华为云GaussDB(for Redis)六大秒级能力
派尔特医疗在港交所招股书二次“失效”,上市计划实质性延迟
MQ selection (2022.5.9-5.15)
【论文阅读】Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline
Smarter! Airiot accelerates the upgrading of energy conservation and emission reduction in the coal industry
1. 爬虫之Beautifulsoup解析库&在线解析图片验证码
Unity 如何拖拉多个组件中的一个
8 - function
MQ advantages and disadvantages (2022.5.2-5.8)
TorchDrug--药物属性预测
4.3-inch touch screen 12 channel control port programmable network central control supports mutual backup of 5 central control hosts
Application of VoIP push in overseas audio and video services






















