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(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
该
SessionRepositoryFilter
过滤器覆盖了原来servlet中的request和response接口中定义的操作session方法,替换成自己的session方法.在过滤的时候,总是会执行一个finally语句块,在finally中提交session,保存到Redis session以hash结构存放在 redis , 默认的过期时间30分钟 .
-
调用
SessionRepositoryRequestWrapper#getSession()
方法时,返回的是自己封装的HttpSessionWrapper
对象【SessionRepositoryFilter#SessionRepositoryRequestWrapper.java】
@Override public HttpSessionWrapper getSession() { return getSession(true); }
- 1
- 2
- 3
- 4
- 5
- 后面用 HttpSessionWrapper 的方法,比如
HttpSessionWrapper#setAttribute(String name, Object value)
方法,访问的就是外部数据源,而不是内存中的数据了。
文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。
原文链接:artisan.blog.csdn.net/article/details/113826351
- 点赞
- 收藏
- 关注作者
评论(0)