Spring Session原理及源码分析

原创 2016年05月30日 17:40:14

Spring Session在不改变原有使用方式的前提下可以管理session。
从注解@EnableSpringHttpSession入手:

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ java.lang.annotation.ElementType.TYPE })
@Documented
@Import(SpringHttpSessionConfiguration.class)
@Configuration
public @interface EnableSpringHttpSession {
}

发现导入了配置类
SpringHttpSessionConfiguration

@Configuration
public class SpringHttpSessionConfiguration {

  private CookieHttpSessionStrategy defaultHttpSessionStrategy = new CookieHttpSessionStrategy();

  private HttpSessionStrategy httpSessionStrategy = this.defaultHttpSessionStrategy;

  private List<HttpSessionListener> httpSessionListeners = new ArrayList<HttpSessionListener>();

  private ServletContext servletContext;

  @Bean
  public SessionEventHttpSessionListenerAdapter sessionEventHttpSessionListenerAdapter() {
      return new SessionEventHttpSessionListenerAdapter(this.httpSessionListeners);
  }

  @Bean
  public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(
        SessionRepository<S> sessionRepository) {
      SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<S>(
            sessionRepository);
      sessionRepositoryFilter.setServletContext(this.servletContext);
      if (this.httpSessionStrategy instanceof MultiHttpSessionStrategy) {
        sessionRepositoryFilter.setHttpSessionStrategy(
              (MultiHttpSessionStrategy) this.httpSessionStrategy);
      }
      else {
        sessionRepositoryFilter.setHttpSessionStrategy(this.httpSessionStrategy);
      }
      return sessionRepositoryFilter;
  }

  @Autowired(required = false)
  public void setServletContext(ServletContext servletContext) {
      this.servletContext = servletContext;
  }

  @Autowired(required = false)
  public void setCookieSerializer(CookieSerializer cookieSerializer) {
      this.defaultHttpSessionStrategy.setCookieSerializer(cookieSerializer);
  }

  @Autowired(required = false)
  public void setHttpSessionStrategy(HttpSessionStrategy httpSessionStrategy) {
      this.httpSessionStrategy = httpSessionStrategy;
  }

  @Autowired(required = false)
  public void setHttpSessionListeners(List<HttpSessionListener> listeners) {
      this.httpSessionListeners = listeners;
  }
}

最底下有四个可以配置的Spring Session方式。看名字可以看出他们的作用。
这个配置往Spring容器中配置两个bean。
SessionEventHttpSessionListenerAdapter session事件的监听器适配器
SessionRepositoryFilter session 持久化的过滤器,这是Spring Session的核心。

SessionRepositoryFilter 可以支持两种策略,

  1. CookieHttpSessionStrategy是基于Cookie的默认实现。

  2. MultiHttpSessionStrategy可以支持多个用户在一个浏览器上。

SessionRepositoryFilter 过滤核心代码

@Override
protected void doFilterInternal(HttpServletRequest request,
      HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
  request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);

  SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryRequestWrapper(
        request, response, this.servletContext);
  SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(
        wrappedRequest, response);

  HttpServletRequest strategyRequest = this.httpSessionStrategy
        .wrapRequest(wrappedRequest, wrappedResponse);
  HttpServletResponse strategyResponse = this.httpSessionStrategy
        .wrapResponse(wrappedRequest, wrappedResponse);

  try {
      filterChain.doFilter(strategyRequest, strategyResponse);
  }
  finally {
      wrappedRequest.commitSession();
  }
  HttpServletRequest strategyRequest = this.httpSessionStrategy
        .wrapRequest(wrappedRequest, wrappedResponse);
  HttpServletResponse strategyResponse = this.httpSessionStrategy
        .wrapResponse(wrappedRequest, wrappedResponse);
}

SessionRepositoryRequestWrapper及
SessionRepositoryResponseWrapper是将
HttpServletRequest、HttpServletResponse包装成的可以提供session持久化功能的类。

HttpServletRequest strategyRequest = this.httpSessionStrategy
      .wrapRequest(wrappedRequest, wrappedResponse);
HttpServletResponse strategyResponse = this.httpSessionStrategy
      .wrapResponse(wrappedRequest, wrappedResponse);

利用多态完成request及response的实现转换。

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring-boot通过HttpSessionListener监听器统计在线人数

spring-boot通过HttpSessionListener监听器统计在线人数
  • zhangjq520
  • zhangjq520
  • 2016年12月15日 15:13
  • 5691

spring http session 入门配置说明

简单demo,基于版本1.2 一.流程概述 主要是通过扩展ServletRequestWraper来实现的。 1.SessionRepositoryFilter.doFilterInternal 2...
  • shuipinglp
  • shuipinglp
  • 2016年06月03日 15:05
  • 2289

spring boot学习5之session+redis解决session共享问题

应用的集群部署或分布式部署,经常遇到session共享的问题,要么在nginx代理解决(比如ip hash),要么在tomcat的context.xml配置redis。spring boot也提供了s...
  • dream_broken
  • dream_broken
  • 2017年05月24日 15:47
  • 6175

Spring Session实现Session管理的原理与详细配置

长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新。 但是,现代的趋势是微服务以及可水平扩展的原生云应...
  • qq_22075041
  • qq_22075041
  • 2017年12月06日 09:24
  • 183

spring session 简单的了解

spring session 简单的了解主要参考链接: 通过Spring Session实现新一代的Session管理 如何区分不同的用户 spring-session简介、使用及实现原理 s...
  • u012881904
  • u012881904
  • 2017年12月17日 20:09
  • 139

spring-session源码解读-1

ServletContainerInitializerServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,主要用于在容器启动阶段通过编程风格注册Fil...
  • szwandcj
  • szwandcj
  • 2015年12月08日 23:16
  • 2799

spring-session源码解读-3

ServletRequestWrapperServlet规范从2.3起引入了ServletRequestWrapper包装类,它把调用交给被包装的ServletRequest来执行。这样就可以对Ser...
  • szwandcj
  • szwandcj
  • 2015年12月11日 00:00
  • 1821

使用SpringSession时cookies跨域导致Session不一致问题的解决

SpringSession默认使用Cookies保存和传递SessionId,在单WebApp情况下,SessionId可以正常传递,但在多WebApp时SessionId则无法正常保存和传递,仍然会...
  • alaska_bibi
  • alaska_bibi
  • 2016年11月11日 10:28
  • 7046

spring-session简介、使用及实现原理

一:spring-session 介绍 1.简介 session一直都是我们做集群时需要解决的一个难题,过去我们可以从serlvet容器上解决,比如开源servlet容器-...
  • wojiaolinaaa
  • wojiaolinaaa
  • 2017年03月16日 16:45
  • 24375

Spring-session & redis 子域名共享session

Spring-session & redis 子域名共享session例子: a.example.com b.example.com Spring 版本 4.2.6.RELEASE Spring-s...
  • beflyabot
  • beflyabot
  • 2016年05月18日 23:53
  • 3311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Session原理及源码分析
举报原因:
原因补充:

(最多只允许输入30个字)