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对项目改善: