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,