文档章节

Spring Session Redis 在不同服务间共享 Session 时的类共享方案

OSC知行合一
 OSC知行合一
发布于 09/02 17:12
字数 891
阅读 269
收藏 2

Spring Session Redis 是不安全的

当在多服务之间使用 Spring Session Redis 进行 Session 共享要非常小心,因为它很不安全,很有可能导致整个服务实例不可用,无法处理任何请求。其中比较危险的地方就是在进行序列化,反序列化的时候(这种类型的错误尤其容易在没有开发规范的团队内发生,就是什么样的数据可以往共享存储里面存,什么样的不能存。存的时候要以什么样的格式去存,这些都要有规定才比较安全。因为共享存储是会影响到别人的不仅仅是为了自己的服务用起来方便)。RedisSerializer 接口的实现都是在序列化和反序列化出错的时候直接抛出异常从而导致整个请求错误。

public interface RedisSerializer<T> {

	/**
	 * Serialize the given object to binary data.
	 * 
	 * @param t object to serialize
	 * @return the equivalent binary data
	 */
	byte[] serialize(T t) throws SerializationException;

	/**
	 * Deserialize an object from the given binary data.
	 * 
	 * @param bytes object binary representation
	 * @return the equivalent object instance
	 */
	T deserialize(byte[] bytes) throws SerializationException;
}

 

下面用一张图来说明我遇到的问题。Spring Session 的诞生老实说并不是为了分布式系统,而是为集群系统提供了一种 Session 解决方案。但是我们把 Spring Session 用在了分布式系统上用以解决 Session 共享的问题老实说本身就是有点难为人家 Spring Session 了 。

 

Spring Session 实现 Session 共享的大致原理

Spring Session 实现 Session 共享的大致原理如下图所示 , 使用一个 Filter 来拦截所有请求,在拦截到请求之后对 HttpServletRequest 和 HttpServletResponse 进行包装 (HttpServletRequestWrapper  , HttpServletResponseWrapper)。在包装中对 session 进行控制 ,将 session 数据都存储在第三方存储当中。

 

Spring Session Redis 在不同服务间共享 Session 时的类共享方案

在了解了 Spring Session 的工作原理后再去考虑这个问题就有头绪了 。还是通过图形的方式来做大概的说明。

 

学习 Spring Session 的 SessionRepositoryFilter 的实现方式 , 添加一个 Filter 顺序在 SessionRepositoryFilter 之后 , 在拦截过程中包装 HttpServletRequest , 重写 getSession(boolean create)  和 getSession() 方法, 自定义一个 SafetyHttpSessionWrapper 包装 Session ,重写 setAttribute(String name , Object value) 函数 , 在保存属性成功后利用 redis 的发布订阅机制发送消息到 redis , 消息的内容为所保存对象的 .class 文件数据。在消息订阅端 , 接收到消息后利用 javassist 和 net.bytebuddy.dynamic.loading.ByteArrayClassLoader 将 .class 文件数据加载转换成 Class 的实例对象,但是这个  Class 实例的范围被限定在 ByteArrayClassLoader 中 , 而这个 ByteArrayClassLoader 是提供给 RedisSerializer 内部使用的 , 比如 JdkSerializationRedisSerializer , GenericJackson2JsonRedisSerializer 都需要使用到 ClassLoader 。这样当 服务A 在存储任何自定义的对象在 Session 中时, 访问服务 B 也不会出现读取 Session 反序列化 ClassNotFoundException 的错误了。

 

初版代码实现

以上思路的代码实现在 WORKX 项目中,感兴趣的同学可以参考 org.hepeng.workx.spring.session.redis.serializer 这个包下的代码。从 org.hepeng.workx.spring.session.redis.serializer.SafetyRedisSerializerConfiguration 这个类入手看源码。目前 RedisSerializer 组件只支持了 JdkSerializationRedisSerializer , GenericJackson2JsonRedisSerializer 以及它们的子类。

© 著作权归作者所有

OSC知行合一

OSC知行合一

粉丝 71
博文 124
码字总数 89052
作品 2
东城
程序员
私信 提问
JAVA基础--session共享的前生今世

session共享的前生今世 Session及cookie基本概念及生命周期 session   当浏览器发起一个新的HTTP请求时,WEB服务端会主动创建一个session.并分配一个sessionID作为服务端识别客户端的一个标...

spinachgit
2018/11/15
110
0
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享

Spring Boot 使用 Spring Session 集成 Redis 实现Session共享 《Spring Boot 2.0极简教程》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 通常在web开发中,Session 会话管理是很重要...

程序员诗人
2018/04/17
0
0
springboot之Redis的使用

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lis...

无语年华
2018/05/09
1K
0
spring-boot整合spring-session,使用redis共享

本文讲述spring-boot工程中使用spring-session机制进行安全认证,并且通过redis存储session,满足集群部署、分布式系统的session共享。 java工程中,说到权限管理和安全认证,我们首先想到的...

louieSun
2018/05/13
0
0
spring-session + redis 实现集群 session 共享

目前市面上实现session共享的方案有很多,其中比较常用的是使用Tomcat、Jetty等web服务器提供的session共享功能,以此将session内容统一存放在数据库(如mysql)或者缓存(redis)中;另外一...

大兵瑞恩
2017/11/02
823
5

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
7
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部