登录与会话保持
基于Session
Session含义为会话,而会话保持即保存登录状态
- 发送短信验证码:保存短信验证码
- 登录 / 注册:取出短信验证码与用户提交的参数进行比对
其他概念:
- Cookie 是保存在用户的浏览器中的,而 Session 是保存在后端服务器中的
- Cookie 中携带着 SessionId,SessionId 对应着后端服务器中的 Session
- 在校验登录状态时,前端发起请求:Cookie -> SessionId -> Session -> 用户信息 -> 得知用户已登录
短信验证码登录

1 | /** |
检验登录状态 & 会话保持
登录拦截器

拦截器
1 | public class LoginInterceptor implements HandlerInterceptor { |
拦截器添加到SpringMVC的拦截器列表
1 |
|
数据脱敏
- 封装
UserDTO,返回给前端的Entity数据使用BeanUtil工具类转成DTO - 存储到
ThreadLocal中的数据也进行数据托名
存在问题:分布式集群环境中,会话存在服务器内部,服务器之间各自会话不可见、不可共享。
解决方法:
- Session拷贝:
Tomcat提供了Session拷贝功能,但是这会增加服务器的额外内存开销和数据拷贝延迟。 - Redis代替Session
基于Redis
短信验证码登录

考虑:
-
用什么数据类型
-
key怎么设计
-
是否设置TTL及时间
-
最佳实践
- 短信验证码:String类型
- key设计:phone:手机号
- 验证码:设置TTL为3min
- 用户信息:Hash类型。可以对单个字段进行CRUD(CRUD:Create, Read, Update, and Delete)
- key设计:使用随机token,例如UUID
- 会话保持:1h - 6h
- 短信验证码:String类型
1 | /** |
校验登录状态 & 会话保持
再一次划分拦截器
- 拦截一切路径的保持用户登录态的拦截器:保证刷新 token 的有效期
- 拦截需要登录态操作的校验用户登录态的拦截器:设置白名单
保护用户登录状态
1 | public class RefreshTokenInterceptor implements HandlerInterceptor { |
登录拦截器
1 | public class LoginInterceptor implements HandlerInterceptor { |
拦截器添加到SpringMVC的拦截器列表
1 |
|