(封面: 中西部情绪)
1.发送验证码
核心逻辑比较简单,如图验证码使用的UUID模拟的验证码,用户需要参传入对应的手机号码。
当用户点击获取验证码之后我们需要将其存入redis缓存当中,后续用作验证码比对,以免用户后续更换手机号使用原先的验证码调包登录。
2.登录 (重要)
用户需要传入对应的手机号验证码进行登录操作,先校验了用户的手机号是否合法,之后从redis中获取对应手机号的验证码并且验证。这里有个小功能,就是没有查询到用户的时候此时会自动注册一个用户提升用户的体验感。生成随机token的后续会作为存储当前登录用户数据的key值,如果用户可以正常登录,先获取用户的数据如果没有数据就帮用户注册一个新用户,如果有数据就先读取用户数据存入redis当中就像前面一样这个key就是UUID生成的随机token,登录成功的时候将这个token返回给前端,之后前端的每次请求都会携带这个token,我们后端只要有这个token就很容易获取redis里面的用户数据,设置过期时间30分钟,以免redis存储爆满,30分钟存储时间指的是用户30分钟未操作,如果在这30分钟中操作了就要实时刷新这个时间,所以这个逻辑我们放在了拦截器里面去实现。
3.双层拦截器 (重要)
两个拦截器分别为登录拦截器还有一个是刷新token拦截器
刷新token拦截器。上一个点说到了30分钟的事情,此时最佳实践是在拦截器中去刷新这个时间,因为每次请求打到服务器中去的时候都需要经过拦截器,我们就在拦截器中实现这个操作。登录的时候我们返回了一个UUID生成的随机token,所以每次请求我们只要获取请求头中的authorization中的数据就可以拿到redis存储用户数据的key值,我们直接去获取redis当中的用户数据并且将其存入threadlocal当中去方便后续的使用,此时任何操作都需要放行到第二拦截器当中,这个拦截器主要是实现刷新token的操作,任何网络请求都会经过这个拦截器所以最后一步是刷新redis中的token的时效性
登录拦截器。直接获取刷新token拦截器中提前存入的threadlocal的数据,判断这个里面是否有值如果有值说明登录了,没有则反之。