本文使用的是手机号+验证码的登录方式,其中验证码是通过在控制台输出,并没有真的发送到手机上(太麻烦,主要目的还是学习使用Redis)
重点是看思路,而不是具体的代码实现
UserServiceImpl实现类
整体结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
sendCode方法
这个是发送验证码的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
注:这里的RedisConstants是一个用来存放各种常量的类
1 2 3 4 5 6 |
|
login方法
这里使用了MybatisPlus来操作数据库(User user = query().eq("phone", phone).one();),但是这个不是重点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
createUserWithPhone方法
在login方法中调用了该方法
这里也使用了MybatisPlus来操作数据库(save(user);)
1 2 3 4 5 6 7 8 9 |
|
拦截器
整体框架
其实就是实现了HandlerInterceptor的两个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
UserHolder是ThreadLocal 持有类
1 2 3 4 5 6 7 8 9 10 11 12 |
|
preHandle方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
注:authorization 是前端定义的用来传递token的key
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
整体思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
复制到未命名绘图 - draw.io中用mermaid格式文件创建流程图
优化
目前之后访问被拦截的页面才会刷新有效期,所以这里我们需要优化一下
方式是采用拦截器链,即再加一个拦截器来拦截全部页面,以此来更新有效期
RefreshTokenInterceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
LoginInterceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
注:order方法是用来设置哪一个拦截器在前,哪一个在后;规则:数字小的在前,数字大的在后