Spring Session - 源码解读

举报
小工匠 发表于 2021/09/09 22:43:14 2021/09/09
【摘要】 文章目录 Spring Session 流程图源码分析 Spring Session 流程图 Spring Session 主要是利用过滤器,偷梁换柱,实现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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。