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 Session解决分布式Session问题的实现原理

上一篇:使用Spring Session和Redis解决分布式Session跨域共享问题 : http://blog.csdn.net/xlgen157387/article/details/574...

使用Spring Session和Redis解决分布式Session跨域共享问题

前言对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash、轮训、根据权重、随机等。不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tom...

利用spring session解决共享Session问题

Spring Session是Spring的项目之一,GitHub地址:https://github.com/spring-projects/spring-session。 Spring Sessio...

使用Spring Session和Redis管理session

使用Spring Session和Redis管理session

Spring中基于Java的配置@Configuration和@Bean用法

Spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置。 一、首先,需要xml中进行少量的配置来启动Java配置: <beans xmlns="...
  • vvhesj
  • vvhesj
  • 2015-08-14 14:34
  • 86838

springmvc启动过程

一年前写过springMvc基于javaConfig的实现,这篇文章主要介绍通过ServletContainerInitializer来实现可插拔性.进而实现基于javaConfig的springMv...

spring session入门

参考资料: http://projects.spring.io/spring-session/#quick-start http://docs.spring.io/spring-session/doc...

SpringSession集成redis实现session共享(No bean named 'springSessionRepositoryFilter' available)

分布式部署架构下传统的session共享有一定的局限性(你来到这儿想必已经受到了其带来的困扰),所以,springsession + redis(NSQL内存数据库)成了当下一个很好很时髦的选择 -...

关于spring session redis共享session的一个坑

关于spring session redis共享session的一个坑,这两天写spring session redis发现几个小问题,挨个絮叨絮叨

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionReposit

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionRepos...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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