首页 > 其他 > 详细

如果当前微服务是一个大型情侣酒店,那么我们该如何管理众多房客而不乱套?(一)

时间:2020-10-17 18:55:55      阅读:21      评论:0      收藏:0      [点我收藏+]
这里就涉及到会话管理,有两种会话方式:Session与JWT,在项目当中推荐使用JWT方式作为会话技术,以下是这两种会话方式的区别。
Session-Cookie
这种会话方式我们需要区分为传统单机Session与分布式Session。
在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器(单JVM内有效)管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。分布式与集群场景下,请求将被负载发送至不同服务器,Session必需要被共享方可满足需求。
传统Session存储架构:
技术分享图片

 

分布式Session登场
会话信息存储在服务器端Session对象当中,这种方式在分布式会话场景下,相对比较繁琐一点,一般我们用SpringSession做分布式会话,会话信息一般会选择第三方中间件进行存储,比如:MongoDB,Redis,Mysql,这三种存储方式分布式会话框架SpringSession都支持,已经提供springboot的集成,我们只需要做相关配置即可。
技术分享图片
 1 比如我们一Redis作为分布式Session存储服务 
 2 第一步:引入依赖 
 3 <!‐‐sessions 依赖‐‐> 
 4 <dependency> 
 5     <groupId>org.springframework.session</groupId> 
 6     <artifactId>spring‐session‐data‐redis</artifactId>         
 7     <version>2.0.6.RELEASE</version>
 8  </dependency> 
 9 <!‐‐redis 依赖‐‐> 
10 <dependency> 
11     <groupId>org.springframework.boot</groupId> 
12     <artifactId>spring‐boot‐starter‐data‐redis</artifactId>     
13     <version>2.0.6.RELEASE</version> 
14 </dependency>
15 在application.yml配置redis与Session 
16 spring: 
17     redis: 
18         host: 192.168.0.198 
19         port: 6379 
20     session: 
21 # spring session使用存储类型,springboot默认就是使用redis方式,如果不想用可以填n one。 
22         store‐type: redis
23  分布式会话搞定!就这么简单                 
View Code
SpringSession原理如下图: 
技术分享图片

 

JWT
全称JSON Web Token,用户会话信息存储在客户端浏览器,它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象进行安全传输信息。这些信息可以通过对称/非对称方式进行签名,防止信息被串改。。由此可知JWT是:
 1 是JSON格式数据
2 是一个Token,也就是一个令牌方式 
JWT数据包含三部分: 
 1 Header
2 Payload
3 Signature 
三者组合在一起 
 1 Header.Payload.Signature
2 示例: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZX hwIjoxNTc3NzgwOTQ5fQ.qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw 
Header
1 描述JWT元数据 
2 {
3 alg: "HS256", 
4 typ: "JWT" 
5 }
6 1、alg属性表示签名的算法,默认算法为HS256,可以自行别的算法。 
7 2、typ属性表示这个令牌的类型,JWT令牌就为JWT。 Header = Base64(上方json数据)
Payload
 1 使用方式如下,userid,created(token创建时间),exp(最近更新时间)
2 data = {"userid":"yangguo","created":1489079981393,"exp":1489684781} Payload = Base64(data) //可以被反编码,所以不要放入敏感信息 
Signature
 1 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
2 secret为加密的密钥,密钥存在服务端 
JWT工作方式
1 通常我们把token设置在request‐Header头中,每次请求前都在请求头加上下方配置 Authorization: Bearer <token> 示例:
2 Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3Nj E0OTQ3OCwiZXhwIjoxNTc3NzgwOTQ5fQ.qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K 8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw
JWT身份认证流程
1、用户提供用户名和密码登录
2、服务器校验用户是否正确,如正确,就返回token给客户端,此token可以包含用户信息
3、客户端存储token,可以保存在cookie或者local storage
4、客户端以后请求时,都要带上这个token,一般放在请求头中
5、服务器判断是否存在token,并且解码后就可以知道是哪个用户
6、服务器这样就可以返回该用户的相关信息了 
流程图如下:
技术分享图片

 

jwt与session会话的对比
jwt:用户信息存在客户端(storage,cookie),
jwt-泄露后?
密码丢失后,修改密码!修改之后
jwt-每次传递token;
Session:
本地:jessionid-服务端:redis里的用户信息
有状态:

如果当前微服务是一个大型情侣酒店,那么我们该如何管理众多房客而不乱套?(一)

原文:https://www.cnblogs.com/powerZhangFly/p/13831670.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!