1.解决短信登陆–2023.4.14

redis

tips—-“login:user”自动分类,如果有多个login:的文件,则会变成login文件夹下的user

数据类型

String:

Hash:

List:

Set:

阿里云短信服务

把aliyun短信服务都自己封装到MessageUtils

只需要

这样调用即可

存入redis的key和value

login:code:{phone}———>验证码

login:token:{token}———->userDTO

流程

关键凭证还是靠的:前端那自己的token去找redis里的token看找不找得到,如果redis里面的token被删了,就是说你得重新登陆了,重新来个token给redis

1.短信登陆注册

->保存redis,{token —> userDTO}//存到redis—- token->userDTO,一方面便于快速取出user信息,另一方面用token作为登录凭证——30minTTL

—->返回token给前端,以便于客户在浏览器可以用token证明自己登陆了

2.此后每次操作校验登录状态

—>前端发起请求,用前端浏览器的token作为authorization请求头,传给了后端,

—->后端利用authorization作为token去redis获取userDTO,拿到自己作为用户的信息来证明登录了

——>如果发现前端没有token或者 后端那这前端token找不到redis对应的tokon->user,那也完蛋了,不放行

—>刷新有效期

———>判断是否放行

3.关于拦截器

class RefreshTOkenINterceptor{    preHandle(request,response,handler);{        //获取请求头中的token        //token换取redis的userDTO        //userDTO存入threadLocal        //刷新token的TTl    }}loginInterceptor{    preHandle()    {        //读取threadLoacl中是否有用户        //有-》放行        //没有-》拦截    }}

同一个用户通过多个拦截器,整个过程中都是同一个thread,同一个ThreadLocal

后端在用户登录之后返回用户的token给前端,前端把authori = token

dto的意义

因为我们本来要把user存到存到的是redis,但是redis是内存里存的肯定存的内容要求精简,所以我们选择存UserDTO (只包含user中部分信息内容)

给token设置有效期

让30分钟自动删除不继续访问操作的某用户的token—->清楚了redis占用—–>也让用户30分钟得重新登录

优化用户体验(用户30分钟得重新登录)—->转为用户30min不操作才重新登陆—->拦截器中对每次操作请求都preHandle成功return之前进行刷新token的TTL

拦截器的类没有交给Spring

由于拦截器 LoginInterceptor implments HandlerInterceptor只是实现了类,但是没有类头上@XX的注解,没有交给Spring去认识——》所以在LoginInterceptor类里面用不了@Resource——>得自己去找StringRedisTemplate的实例

Constants

把一些重复使用的常量统一写道同一个Constants—->避免后续手动写错

2.商户查询缓存(不采用SpringCache,而是尝试原理实现)2023-4-13

功能:

直接从1s->10ms

流程:

opsForValue().increment(key,delta)

就会让redis里面的这个key对应的value进行自增delta,默认为1

increment()方法是实现递增,对于同一个KEY,执行一次,如果key存在,则把value的值增加delta,