短信登录
基于Session实现登录
流程:
发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用)
不能每次请求服务都要进行登录状态校验,解决办法:拦截器
在Spring框架中,拦截器(Interceptor)可以通过实现HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类来实现。拦截器通常用于在请求到达控制器之前进行预处理,例如身份验证、权限检查等。
1.创建拦截器(拦截器需要实现HandlerInterceptor
接口,并重写方法)
2.注册拦截器(通过WebMvcConfigurer
接口来注册拦截器。)
3.配置拦截器的排除路径(在实际应用中,某些接口(如登录、注册接口)不需要进行身份验证)
区分一下session,cookie和token
Cookie : Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来,服务不保存。每次请求时客户端带上cookie。服务器检查该Cookie,以此来辨认用户状态。
**Session:**服务器在处理客户端请求过程中会创建session,并且为该session生存唯一的session ID。
服务器将session ID发送到客户端.当客户端再次请求时,就会带上这个session ID.服务器接收到请求之后就会一句Session ID 找到相应的Session ,完成请求.session是服务本地保存,发给客户端,客户端每次访问都带着,直接和服务的session比对
Token:Token是服务端生成的一串字符串,当作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码.token是 服务经过计算发给客户端的,服务不保存,每次客户端来请求,经过解密等计算来验证是否是自己下发的.
**JWT:**JWT不仅仅是一个生成Token的过程,它还提供了一种结构化、自包含、无状态的Token设计。验证Token时,服务器不需要查询数据库,直接解析和验证签名即可。
|-----------|----------|--------------|----------|
| 机制 | 存储位置 | 通信方式 | 生命周期 |
| Cookie | 浏览器 | 自动Header携带 | 可设置过期时间 |
| ️ Session | 服务端 | SessionID传递 | 服务端控制 |
| Token | 客户端 | 手动Header添加 | 令牌有效期决定 |
| ️ JWT | 客户端 | Bearer Token | 包含过期时间声明 |
集群Session共享问题
session的痛点(负载均衡导致的)
多态Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题

基于Redis实现共享session登录

发送验证码逻辑实现:
1.校验手机号
2.不符合返回错误信息
3.符合生成验证码
4.保存验证码到redis
5.发送验证码
登录验证逻辑:
1.校验手机号
2.不符合返回错误信息
3.从redis中获取验证码并校验
4.不一致报错,一致,根据手机号查询用户
5.判断用户是否存在
6.保存用户信息到redis
6.1随机生成token,作为登录令牌
6.2将User对象转为Hash存储
6.3存储
7.返回token