1. 方案选择
- 方案一(session):整合Spring security,同时将session缓存到redis实现集群化管理
- 方案二(token): 通过jwt生成token,每次请求都携带此token,后端通过拦截器解析token
两种方案各有优缺点,盒子IM早期采用的是方案一,但是遇到了两个问题:
- 同一个浏览器无法同时登陆多个账号:第2个账号登录时,会自动顶掉第一个账号的session
- ws连接校验不容易实现: session是通过http的header中的sessionId实现,因此与http协议是强捆绑关系,并不支持ws协议
所以最后改用了方案二,也就是使用token的方式
2. 交互流程
-
2.1. 获取token
主要步骤代码:
步骤类名方法1,2,3,4UserServiceImpllogin2.2. token校验
-
token的校验通过拦截器实现,对所有接口(除登录等个别接口)进行统一拦截校验:
图中只是已请求用户消息接口为例,其他请求亦是如此。主要步骤代码:
步骤类名方法2AuthInterceptorpreHandle
2.3. 刷新token
accessToken的过期时间只有半个小时,而refreshToken7天才会过期。
当accessToken过期时,需要调用/refreshToken接口,换取新的token。
-
主要步骤代码:
步骤
|
类名
|
方法
|
1,2,3,4
|
UserServiceImpl
|
refreshToken
|
3. 用户无感知刷新token
上一小节中介绍了当token过期时如何去换取新的token,那么问题来了,程序应该如何感知到token已经过期了呢?
- 方案一:前端用定时器对token的过期时间进行检测,如果快过期了,则进行token刷新
- 方案二:通过前端的http拦截器实现,用户发请求时被此拦截器捕获,此时如果发现token过期时,进行刷新token,然后重新发起请求
显然方案二更为优雅,所以盒子IM采用是方案二。
主要实现代码(前端):
目录
|
文件名
|
方法
|
im-web/src/api/
|
httpRequest.js
|
所有
|
im-uniapp/common/
|
request.js
|
所有
|
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容