当前位置:网站首页>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的情况;
边栏推荐
- 为什么一定要从DevOps走向BizDevOps?
- Kubevela 1.4: make application delivery safer, easier to use, and more transparent
- C语言:hashTable
- Detailed steps for Django to upload excel tables and write data to the database
- The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
- Convert seconds to * * hours * * minutes
- 软件工程最佳实践——项目需求分析
- 8 - function
- Filebeat custom indexes and fields
- Is it safe to open an account for mobile phone stock trading!?
猜你喜欢

Primary school, session 3 - afternoon: Web_ sessionlfi

Tupu software has passed CMMI5 certification| High authority and high-level certification in the international software field

无线充U型超声波电动牙刷方案开发

更智能!AIRIOT加速煤炭行业节能减排升级
![[jetsonnano] [tutorial] [introductory series] [i] how to enable VNC sharing](/img/f5/3f0f69739caa22809f40cf4b7483fe.png)
[jetsonnano] [tutorial] [introductory series] [i] how to enable VNC sharing

实现各种效果和功能的按钮,读这篇文章就够了

新出生的机器狗,打滚1小时后自己掌握走路,吴恩达开山大弟子最新成果

Why should offline stores do new retail?

昔日果汁大王,16个亿卖了

1. 爬虫之Beautifulsoup解析库&在线解析图片验证码
随机推荐
pycharm从安装到全副武装,学起来才嗖嗖的快,图片超多,因为过度详细!
RP原型资源分享-购物类App
How does an in memory database take advantage of memory?
如何快速通过PMP考试?
History, selection strategy and in-depth evaluation of note taking software
Kubernetes为什么会赢,容器圈的风云变幻!
mysql统计账单信息(上):mysql安装及客户端DBeaver连接使用
重复乃技艺之母
网易云签到可抽奖?那一年我能签到365天。不信?你看。
Wechat applets - basics takes you to understand the life cycle of applets (2)
[multithreading] use the thread pool to implement a simple thread pool
1. 爬虫之Beautifulsoup解析库&在线解析图片验证码
pycharm有用快捷键
企业中通过组策略管理Edge浏览器设置(IE模式、主页绑定等)
Tencent conference application market was officially launched, with more than 20 applications in the first batch
【ICLR 2021】半监督目标检测:Unbiased Teacher For Semi-Supervised Object Detection
WordPress 博客使用火山引擎 veImageX 进行静态资源 CDN 加速(免费)
What securities dealers recommend? In addition, is it safe to open a mobile account?
小学期,第三场-下午:WEB_xxe
Data intelligence - dtcc2022! China database technology conference is about to open













