文章目录

  • 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 - 源码解读相关推荐

  1. 【赠书福利】掘金爆火小册同名《Spring Boot源码解读与原理剖析》正式出书了!...

    关注我们丨文末赠书 承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解 ...

  2. 实战:Spring Boot源码解读与原理分析

    承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解读与原理剖析> ...

  3. Spring Session源码解析

    AbstractHttpSessionApplicationInitializer,很明显它是一个初始化的类,它是一个抽象类,可以理解为一个公用的基类,然后看一下onStartup这个方法,最主要的方 ...

  4. Spring:源码解读Spring IOC原理

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Ioc/DI? IOC容器:主要是完成了 完成对象的创建和依赖的管理注入等. 先从我们自己设计这样一个视角来考虑: ...

  5. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类. org.springframework.beans.ann ...

  6. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  7. 【转载】Spring @Async 源码解读。

    由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...

  8. spring core源码解读之ASM4用户手册翻译之一asm简介

    第一章:ASM介绍 1.1 ASM动机: 程序的分析,生成,转换技术可以应用到许多场景: 1.程序分析,从简单的语法解析到完整的语义分析,可以应用在程序中找到潜在的bug,发现无用的代码,工程代码的逆 ...

  9. spring beans源码解读之--Bean的注解(annotation)

    随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家. 1. spring beans ...

最新文章

  1. wordpress从apache迁移到nginx
  2. jQuery-helloWorld
  3. java 线程转储_获取Java线程转储的常用方法(推荐)
  4. 查询2019-06-20日 和 2019-06-23  每个商品每天的入库情况
  5. JS将各值拼接JSON串小例
  6. java中sam接口_具有非SAM接口的lambda的Java习惯用法
  7. matlab 和 ampl 结合,AMPL和MATLAB结合使用示例
  8. linux mud 游戏,一笑天涯MUD游戏
  9. Jenkins骚操作第十三章之基于Kubernetes/K8S构建Jenkins持续集成平台(上)
  10. cad2017插入电气符号_电气电气CAD图形符号大全.pdf
  11. 20款网管须知的工具,你知道几个?
  12. 昆仑固件涉密专用计算机,存储处理国家秘密的计算机信息系统按照涉密程序实行...
  13. 构建技术影响力 5.0
  14. 农夫过河算法最简便的c语言,C语言农夫过河
  15. Windows 10 C:/Users/用户名/AppData里面的文件选择性清空
  16. 独立产品灵感周刊 DecoHack #013
  17. 深入浅出JMS(二)——JMS的组成
  18. 【题解】纪中篮球联赛
  19. 运营商造势 CP、SP发力手机游戏
  20. B站学习云开见明:Python数据分析入门到精通学习笔记

热门文章

  1. linux如何把nfs数据导出来,linux – NFS导出已经挂载NFS的目录(在服务器上)
  2. linux arcgis10.4安装教程,ArcGIS 10.1 for Server安装教程系列—— Linux下的单机安装
  3. Orange‘s 一个操作系统的实现--Bochs遇到的问题
  4. opencv 边缘检测
  5. erlang mysql driver_erlang_mysql_driver 源码分析2
  6. Leetcode 349. 两个数组的交集 (每日一题 20211014)
  7. 卷积神经网络原理及实现
  8. tensorflow 就该这么学--1
  9. R语言实战应用精讲50篇(十九)-R语言gganimate函数应用案例:静态图变成动态,让你的图表更酷炫
  10. MATLAB实战系列(三十六)-MATLAB 离散Hopfield神经网络的分类——高校科研能力评价