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】

     
    	@Override
    	public HttpSessionWrapper getSession() {
           
    		return getSession(true);
    	}
    

  • 后面用 HttpSessionWrapper 的方法,比如HttpSessionWrapper#setAttribute(String name, Object value) 方法,访问的就是外部数据源,而不是内存中的数据了。

你可能感兴趣的:(【Spring,Session】,session,spring,session,源码解读)