前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《SpringCloud篇:聊天实现001遇到问题解决》《单点登录、多端登录》

《SpringCloud篇:聊天实现001遇到问题解决》《单点登录、多端登录》

作者头像
发布2020-12-08 10:10:09
5970
发布2020-12-08 10:10:09
举报
文章被收录于专栏:后端JavaEE后端JavaEE
在这里插入图片描述
在这里插入图片描述

一、pom依赖

在这里插入图片描述
在这里插入图片描述

+公共依赖

在这里插入图片描述
在这里插入图片描述

+插件

在这里插入图片描述
在这里插入图片描述

二、README.md

项目介绍

代码语言:javascript
复制
### 这个项目是所有项目的父工程,禁止任何开发人员对其修改
### 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的结构是什么?头部,载荷,签证

代码语言:javascript
复制
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得到状态码结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、pom依赖
  • 二、README.md
  • 三、新建model
    • 3.1pom依赖指定父工程
      • 3.2创建一个controller,聊天用的,在给他们一个父类BaseController
      • 四、.扩展:单点登录、多端登录(两个事情!!!不要混淆)
      • 五、登录
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档