+公共依赖
+插件
项目介绍
### 这个项目是所有项目的父工程,禁止任何开发人员对其修改
### MAVEN 私服地址
### 使用的微服务的组件的地址
### nacos:
username:
password:
### Redis地址
+依赖(不配置版本号,统一使用一个版本号),数据库使用版本号5.1.47避免时区问题
+连接池
注意:导入子工程时idea下载依赖卡住,关闭idea,任务管理器也关闭idea,百度—手动导入依赖
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得到状态码结果