Spring Session - 源码解读
文章目录
- Spring Session 流程图
- 源码分析
Spring Session 流程图
Spring Session 主要是利用过滤器,偷梁换柱,实现session储存无感知的切换。
源码分析
页面请求被全局的过滤器
org.springframework.web.filter.DelegatingFilterProxy
过滤Spring Session 提供了
SessionRepositoryFilter
过滤器,它会过滤请求时,将请求 HttpServletRequest 对象包装成SessionRepositoryRequestWrapper
对象【SessionRepositoryFilter.java】
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// sessionRepository 是访问外部数据源的操作类,例如说访问 Redis、MySQL 等等request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);// 将请求和响应进行包装成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 对象SessionRepositoryFilter<S>.SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryFilter.SessionRepositoryRequestWrapper(request, response, this.servletContext);SessionRepositoryFilter.SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryFilter.SessionRepositoryResponseWrapper(wrappedRequest, response);// 继续执行下一个过滤器try {filterChain.doFilter(wrappedRequest, wrappedResponse);} finally {// 请求结束,提交 Session 到外部数据源wrappedRequest.commitSession();}}
该
SessionRepositoryFilter
过滤器覆盖了原来servlet中的request和response接口中定义的操作session方法,替换成自己的session方法.在过滤的时候,总是会执行一个finally语句块,在finally中提交session,保存到Redis session以hash结构存放在 redis , 默认的过期时间30分钟 .
调用
SessionRepositoryRequestWrapper#getSession()
方法时,返回的是自己封装的HttpSessionWrapper
对象【SessionRepositoryFilter#SessionRepositoryRequestWrapper.java】
@Overridepublic HttpSessionWrapper getSession() {return getSession(true);}
- 后面用 HttpSessionWrapper 的方法,比如
HttpSessionWrapper#setAttribute(String name, Object value)
方法,访问的就是外部数据源,而不是内存中的数据了。
Spring Session - 源码解读相关推荐
- 【赠书福利】掘金爆火小册同名《Spring Boot源码解读与原理剖析》正式出书了!...
关注我们丨文末赠书 承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解 ...
- 实战:Spring Boot源码解读与原理分析
承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解读与原理剖析> ...
- Spring Session源码解析
AbstractHttpSessionApplicationInitializer,很明显它是一个初始化的类,它是一个抽象类,可以理解为一个公用的基类,然后看一下onStartup这个方法,最主要的方 ...
- Spring:源码解读Spring IOC原理
2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Ioc/DI? IOC容器:主要是完成了 完成对象的创建和依赖的管理注入等. 先从我们自己设计这样一个视角来考虑: ...
- spring beans源码解读之--总结篇
spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类. org.springframework.beans.ann ...
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...
- 【转载】Spring @Async 源码解读。
由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...
- spring core源码解读之ASM4用户手册翻译之一asm简介
第一章:ASM介绍 1.1 ASM动机: 程序的分析,生成,转换技术可以应用到许多场景: 1.程序分析,从简单的语法解析到完整的语义分析,可以应用在程序中找到潜在的bug,发现无用的代码,工程代码的逆 ...
- spring beans源码解读之--Bean的注解(annotation)
随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家. 1. spring beans ...
最新文章
- wordpress从apache迁移到nginx
- jQuery-helloWorld
- java 线程转储_获取Java线程转储的常用方法(推荐)
- 查询2019-06-20日 和 2019-06-23 每个商品每天的入库情况
- JS将各值拼接JSON串小例
- java中sam接口_具有非SAM接口的lambda的Java习惯用法
- matlab 和 ampl 结合,AMPL和MATLAB结合使用示例
- linux mud 游戏,一笑天涯MUD游戏
- Jenkins骚操作第十三章之基于Kubernetes/K8S构建Jenkins持续集成平台(上)
- cad2017插入电气符号_电气电气CAD图形符号大全.pdf
- 20款网管须知的工具,你知道几个?
- 昆仑固件涉密专用计算机,存储处理国家秘密的计算机信息系统按照涉密程序实行...
- 构建技术影响力 5.0
- 农夫过河算法最简便的c语言,C语言农夫过河
- Windows 10 C:/Users/用户名/AppData里面的文件选择性清空
- 独立产品灵感周刊 DecoHack #013
- 深入浅出JMS(二)——JMS的组成
- 【题解】纪中篮球联赛
- 运营商造势 CP、SP发力手机游戏
- B站学习云开见明:Python数据分析入门到精通学习笔记
热门文章
- linux如何把nfs数据导出来,linux – NFS导出已经挂载NFS的目录(在服务器上)
- linux arcgis10.4安装教程,ArcGIS 10.1 for Server安装教程系列—— Linux下的单机安装
- Orange‘s 一个操作系统的实现--Bochs遇到的问题
- opencv 边缘检测
- erlang mysql driver_erlang_mysql_driver 源码分析2
- Leetcode 349. 两个数组的交集 (每日一题 20211014)
- 卷积神经网络原理及实现
- tensorflow 就该这么学--1
- R语言实战应用精讲50篇(十九)-R语言gganimate函数应用案例:静态图变成动态,让你的图表更酷炫
- MATLAB实战系列(三十六)-MATLAB 离散Hopfield神经网络的分类——高校科研能力评价