[021-14].第5节:Redis实现短信登录

我的后端学习大纲

我的Redis学习大纲


1.短信登录实现:

1.1.项目架构设计:

  • 1.Nginx是直接在本机Windows环境下部署了前端项目
    在这里插入图片描述

1.2.基础环境准备:

a.建库建表:

  • b_user:用户表
  • tb_user_info:用户详情表
  • tb_shop:商户信息表
  • tb_shop_type:商户类型表
  • tb_blog:用户日记表(达人探店日记)
  • tb_follow:用户关注表
  • tb_voucher:优惠券表
  • tb_voucher_order:优惠券的订单表

b.运行项目:

  • 1.启动后台项目
    在这里插入图片描述
  • 2.访问测试:http://localhost:8081/shop-type/list
    在这里插入图片描述
  • 3.运行前端项目:
    在这里插入图片描述
  • 4.访问测试:
    在这里插入图片描述

2.实现基于session的登录

2.1.登录的业务逻辑:

  • 1.逻辑分析:在登录成功后,信息都会存储在session中,然后我们在做一些重要操作的时候,就先确认是否已经登陆,就先去session中去获取用户
    在这里插入图片描述

2.2.编码实现:

a短信验证码发送功能:

a1.明确业务流程:

在这里插入图片描述

a2.操作流程:点击“我的”,然后输入手机号,发送验证码:

在这里插入图片描述

名称说明
请求方式POST
请求路径/usr/code
请求参数phone:电话号码
返回值
a3.后端逻辑实现:
  • 1.在controller层编写/code接口
    在这里插入图片描述
  • 2.在Service层定义sendCode方法,实现短信发送:
    在这里插入图片描述
  • 3.在serviceImpl层实现业务逻辑:对参数中的手机号进行校验,查看是否符合格式,手机号没问题后,将其验证码保存到session中
    在这里插入图片描述
  • 4.后台发现验证码发送成功
    在这里插入图片描述

b.使用验证码登录和注册功能:

b1.收到验证码后的登录逻辑:

在这里插入图片描述

b2.后台接口定义:

在这里插入图片描述

名称说明
请求方式POST
请求路径/usr/login
请求参数phone:电话号码,code:验证码
返回值
b3.后台编码:
  • 1.controlle层接口编码:
    在这里插入图片描述
  • 2.Service层逻辑实现:最终不需要返回一个登录凭证,原因是在客户端具有cookie,每次进行登录验证的时候,客户端会带着cookie来找session:
    在这里插入图片描述
  • 3.定义的保存用户信息方法:
    在这里插入图片描述

c.登录校验拦截器功能实现:

c1.业务逻辑:

在这里插入图片描述

c2.功能实现:
  • 1.因为在系统中会有很多业务需要验证用户是否登录,所以我们就统一的实现一个拦截器,当用户请求的时候,先全部进行拦截,判断是否登录,然后再进行业务操作:
    在这里插入图片描述
  • 2.定义AllInfoUserHolder方法,来使用ThreadLocal存储用户信息:
    在这里插入图片描述
  • 3.拦截器实现:
    在这里插入图片描述
  • 4.拦截器实现后并没有生效,所以需要编写配置类,引入拦截器,使其生效
    package com.hmdp.config;
    
    import com.hmdp.utils.LoginInterceptor;
    import com.hmdp.utils.RefreshTokenInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import javax.annotation.Resource;
    
    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
        @Resource
        private StringRedisTemplate stringRedisTemplate;
        
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
        
            registry.addInterceptor(new LoginInterceptor())
                    //不需要拦截的请求
                    .excludePathPatterns(
                            "/user/code",
                            "/user/login",
                            "/blog/hot",
                            "/shop/**",
                            "/shop-type/**",
                            "/upload/**",
                            //优惠券相关的请求
                            "/voucher/**"
                    )
                    .order(1);//执行顺序,数字越小越先执行
        }
    }
    

在这里插入图片描述

d.改善:关于Session中存储的用户信息过于详细的改善:

d1.问题分析:
  • 1.如下图所示,在缓存信息中保存了像密码这样的敏感信息,占用过多的内存空间,需要将缓存信息进行优化,减少不必要的信息
    在这里插入图片描述
d2.建UserDTO实体类,session中保存关键信息:
  • 1.建实体类
    在这里插入图片描述

  • 2.改善缓存中存储的用户信息内容:
    在这里插入图片描述

  • 3.保存登录时的用户信息到缓存中:
    在这里插入图片描述

  • 4.获取缓存中信息时返回值类型:
    在这里插入图片描述


2.3.集群session登录的问题

a.缓存共享问题:

  • 1.session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致缓存数据丢失的问题
  • 2.session的替代方案应该足:
    • 数据共享:这样多台tomcat就可以看到相同的session
    • 内存存储:读取速度较快
    • key、value结构:

我可以使用redis来解决这个问题,redis符合上述的所有要求
在这里插入图片描述

3.基于Redis缓存功能实现登录:

3.1.基于Redis实现共享session登录逻辑图

在这里插入图片描述
在这里插入图片描述

3.2.使用的数据结构:

  • 1.保存登录的用户信息,可以使用String结构,以JSON字符串来保存,比较直观:
    在这里插入图片描述
  • 2.Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD,并且内存占用更少(推荐类型):
    在这里插入图片描述

c.编码实现redis对项目改善:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值