1.ControllerAdvice
@ConrollerAdvice:实现对Controller层的切面。
集合@ExceptionHandler对Controller层抛出的异常进行处理。
2.跨域
跨域:服务器保护机制
作用:避免恶意攻击者,利用客户端跨域特性,来盗取用户信息
3.浏览器的保护机制:同源策略
同源策略:协议 && IP && 端口 三者必须相同。如果任意一个不同,浏览器就会认为
请求是一个跨域请求,此时浏览器会额外发送一个 OPTIONS 类型的请求给服务端,此
请求的作用,是询问服务端是否允许跨域。如果服务响应的结果中,包含了
Access-Control-Allow-Origin这类的请求头,并指明了允许哪些域名跨越,此时
浏览器就会针对服务端响应的请求头,判断是否可以跨越。
4.注册需求分析
用户填写手机号——>前端验证手机格式——>后端验证手机是否已注册——>
前端/用户跳转到注册页面,填写注册信息——>后端发送注册验证码——>
后端保存注册信息
5.需求:后端提供验证手机是否已注册
接口实现:
1.接收手机号,查询数据库中是否已存在该手机号
2.如果已经存在返回true,如果不存在返回false
接口设计:
地址:/users/phone/exists
类型:POST
参数:phone 手机号
返回:{code:200, msg:'success', data:true|false}
6.需求:提供发送短信验证码功能的接口
保存验证码技术选型
需求:存储验证码,以及在指定的时间过期
方案:
1.Session:存/过期时间
2.MySql+定时任务:MySql存,定时任务负责过期删除
3.Redis:key的有效期来进行控制
适用场景:
存储:
Session存储在服务器的内存
容易丢失,占用应用内存,集群环境下不共享
MySQL存在数据库服务的硬盘中
IO效率问题
Redis存在Redis服务的内存中
容易丢失=>利用持久化+集群方案尽可能避免该情况
过期时间:
Session的过期时间是针对整个session,可能会影响到其它存储在session中
的数据
Mysql本身不具备过期时间的能力,必须通过定时任务来实现,增加实现的
复杂度
Redis利用key的有效时间来控制过期,实现简单且效果较好。
接口实现:
1.生成6位随机数字的验证码
2.将验证码保存到Redis
3.调用第三方平台接口,发送验证码
4.响应发送结果
接口设计:
地址:/sms/send
类型:POST
参数:
-phone手机号
-type短信类型(REGISTER=注册,CHANGEPASS=修改密码)
返回:{code:200, msg:'success'}
7.SpringMVC响应JSON的三种方式
1.原生:HttpServletResponse resp.getWriter()
2.注解:@ResponseBody
@ResponseStatus 可以修改响应的状态码
3.ResponseEntity:SpringMVC封装的一种通用的响应对象,通过这个对象,
可以快速方便的设置响应状态码/响应头/响应体
8.有状态与无状态
无状态:没有记忆/没有存储数据=>集群方案
有状态:有记忆/有存储数据=>主从方案
主:负责数据的读+写,从:只负责读数据
数据同步 => 主从同步
9.
qo:查询时接收前端查询参数
vo:查询数据库时,如果有超出模型对象以外的其他字段,可以利用vo封装起来
dto => data transfer object => 数据传输对象
dto:用于接收前端参数/微服务之间数据交互
10.
编码:缩小消息体积
加密:保证数据安全
11.
1.jwt可以存储数据,token不能
2.jwt有完善的token维护机制,而自己维护的token管理较为简单
3.jwt有签名机制,相对安全性更高
签名=hash(密钥 + header.body)