核心原理

从@EnableRedisHttpSession这个注解入手开始分析 点进去发现

在这里插入图片描述
给我们导入了这个组件,继续点进去发现
在这里插入图片描述
RedisHttpSessionConfiguration这个类给容器中导入了RedisIndexedSessionRepository这个组件,这个组件就是redis操作session的类,也即session的增删改查相关操作都通过这个类来实现
在这里插入图片描述
再看RedisHttpSessionConfiguration继承了SpringHttpSessionConfiguration
在这里插入图片描述
点进SpringHttpSessionConfiguration这个类我们发现这个类给容器中导入了非常多的组件其中值得注意的是给容器中导入了这样一个组件
在这里插入图片描述
继续往下走:
在这里插入图片描述
在这里插入图片描述我们发现SessionRepositoryFilter实际上实现了javax.servlet.Filter,我们的每个请求都会经过这个filter

继续往下走:
在SessionRepositoryFilter中有这样一个方法doFilterInternal ,它将我们原生的请求和响应拿过来进行包装,将包装后的请求和响应应用到我们的整个执行链,这一段代码也就是springSession的核心原理

在这里插入图片描述
我们获取session 通常都是

HttpSession session = request.getSession();

它将我们的request进一步包装成 wrappedRequest 我们来看看他是如何包装的
点进SessionRepositoryRequestWrapper 我们发现它重写了一个方法
在这里插入图片描述

在这里插入图片描述
总结:
简单的用了一下装饰者模式,此处我用的是redis存储session,当然也可以使用其他存储session,基本原理都是一样

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐