《SpringCloud篇:聊天实现001遇到问题解决》《单点登录、多端登录》
作者:互联网
一、pom依赖
+公共依赖
+插件
二、README.md
项目介绍
### 这个项目是所有项目的父工程,禁止任何开发人员对其修改
### MAVEN 私服地址
### 使用的微服务的组件的地址
### nacos:
username:
password:
### Redis地址
三、新建model
3.1pom依赖指定父工程
+依赖(不配置版本号,统一使用一个版本号),数据库使用版本号5.1.47避免时区问题
+连接池
注意:导入子工程时idea下载依赖卡住,关闭idea,任务管理器也关闭idea,百度—手动导入依赖
3.2创建一个controller,聊天用的,在给他们一个父类BaseController
1.原因:BaseController里面获取request对象,拿到head对象,平时是写注解的,可能会出现多参数定义问题。
2.例如:错误演示如下,使用参数拿到对象
3.写base
4.写继承类controller
5.导致问题:
一个线程进来指向一个request对象,但是controller是单例的,所以声明成员的时候,进行公共调用容易导致多线程操作对象是同一个,导致线程不安全
6.解决:在BaseCcontroller进行统一的封装,
比如调用微服务的用户中心,获取一个人的详细信息,声明微服务的客户端
将token放在base里(拿token的三种方式)
四、.扩展:单点登录、多端登录(两个事情!!!不要混淆)
1.定义
单点登录:为了让所有的服务节点都能统一的知晓用户登录的合法性,进而只在用户中心登录,获取token,这一个token在所有的服务节点都可以使用
多端登录:用户登录以后,如果换一台设备再次进行登录,就有两种方案:
1.把之前登录的用户踢掉线(作废第一个token)
2.也可登录,两端同时操作一个用户的数据、业务、行为
2.图解
优势:去中心化,没有一个中心化去管理JWT,所有服务公用一个JWT。高并发性优势。(中心化,就是其他服务器没能力直接调用JWT,直接解析,每次都需要调用新的接口)。
缺点:踢用户掉线无法实现(拿到token哪里都可以去,想踢客户端掉线,没有意义,因为token在所有服务器上都生效了)。
3.使用Redis实现token,图解
3.1Redis实现踢掉线?
我们需要去请求Redis,删除对应的token与json就可以了。
怎么知道用户对应的token呢?
如果token是用JWT实现的,那么所有节点都可以知道uid,所有节点也都可以通过uid生成token,JWT的结构是什么?头部,载荷,签证
JWT的结构:
1.jwt头:JWT头部分是一个描述JWT元数据的JSON对象
2.有效载荷:七个默认字段+自定义私有字段
3.签名=HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload) ,secret)
因为token是不一样的,所以使用每个服务都有的JWT解析器,直接解析token,生成uid,然后删除uid键对应的key,实现踢掉线。
缺陷:不去中心化了,导致所有节点处理请求都依赖Redis,进而使得Redis要高并发
4.总结:上述两种方式其实解决问题的时候,主要是是否把信息放入redis中,如果想能踢掉线,一定得有一个中心化的东西,它可以是Redis,也可以是一个服务。
权限是自身请求url的时候,我们服务器是否允许的问题
单点登录是,我们服务器是否认识你的问题
5.CAS登录中心,图解
优点:
可以处理踢掉线,在登录的时候将用户id和token存储到表
缺点:
主要问题是网络开销,单点登录中心的负载问题,
当用户无权限的时候,重定向有问题(前端做)
6.多端实现踢掉线功能:在Redis中存储的key上再加一个字段
五、登录
获取头信息里面的token
2.controller子类中调用base
3.自定义状态码R类
+重载
+JSONObject返回值的
3.1基于功能状态码R类
4.controller得到状态码结果
标签:用户,登录,SpringCloud,Redis,token,JWT,踢掉,001 来源: https://blog.csdn.net/qq_39773004/article/details/110791179