`

使用Spring Session做分布式会话管理

 
阅读更多
使用Spring Session做分布式会话管理 http://dorole.com/1422/
如何使用SPRING SESSION实现分布式SESSION管理 http://www.cnphp6.com/archives/111318
在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效。因此打造一个高可用性的系统,必须将session管理从容器中独立出来。而这实现方案有很多种,下面简单介绍下:

  第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等。好处是对项目来说是透明的,无需改动代码。不过前者目前还不支持Tomcat 8,或者说不太完善。个人觉得由于过于依赖容器,一旦容器升级或者更换意味着又得从新来过。并且代码不在项目中,对开发者来说维护也是个问题。

  第二种是自己写一套会话管理的工具类,包括Session管理和Cookie管理,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到Redis中。很显然这个方案灵活性最大,但开发需要一些额外的时间。并且系统中存在两套Session方案,很容易弄错而导致取不到数据。

  第三种是使用框架的会话管理工具,也就是本文要说的spring-session,可以理解是替换了Servlet那一套会话管理,既不依赖容器,又不需要改动代码,并且是用了spring-data-redis那一套连接池,可以说是最完美的解决方案。当然,前提是项目要使用Spring Framework才行。

  这里简单记录下整合的过程:
  如果项目之前没有整合过spring-data-redis的话,这一步需要先做,在maven中添加这两个依赖:
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

  再在applicationContext.xml中添加以下bean,用于定义redis的连接池和初始化redis模版操作类,自行替换其中的相关变量。

<!-- redis -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
</bean>
 
<bean id="jedisConnectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.host}" />
    <property name="port" value="${redis.port}" />
    <property name="password" value="${redis.pass}" />
    <property name="timeout" value="${redis.timeout}" />
    <property name="poolConfig" ref="jedisPoolConfig" />
    <property name="usePool" value="true" />
</bean>
 
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
 
<!-- 将session放入redis -->
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
    <property name="maxInactiveIntervalInSeconds" value="1800" />
</bean>

  这里前面几个bean都是操作redis时候使用的,最后一个bean才是spring-session需要用到的,其中的id可以不写或者保持不变,这也是一个约定优先配置的体现。这个bean中又会自动产生多个bean,用于相关操作,极大的简化了我们的配置项。其中有个比较重要的是springSessionRepositoryFilter,它将在下面的代理filter中被调用到。maxInactiveIntervalInSeconds表示超时时间,默认是1800秒。写上述配置的时候我个人习惯采用xml来定义,官方文档中有采用注解来声明一个配置类。

  然后是在web.xml中添加一个session代理filter,通过这个filter来包装Servlet的getSession()。需要注意的是这个filter需要放在所有filter链最前面。

<!-- delegatingFilterProxy -->
<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  这样便配置完毕了,需要注意的是,spring-session要求Redis Server版本不低于2.8。

  验证:使用redis-cli就可以查看到session key了,且浏览器Cookie中的jsessionid已经替换为session。
127.0.0.1:6379> KEYS *
1) "spring:session:expirations:1440922740000"
2) "spring:session:sessions:35b48cb4-62f8-440c-afac-9c7e3cfe98d3"
分享到:
评论
2 楼 pyzheng 2015-09-17  
恩  可能配置有问题.  这文章我只是收藏转发而已, 并没有实际测试过. 过段时间才会使用这个方式.
1 楼 daijianweinihao 2015-09-17  
我按照你的要求配置了以后  一启动tomcat 就报 No bean named 'springSessionRepositoryFilter' is defined  

相关推荐

    spring session实现分布式会话管理

    Spring Session 是一个开源项目,由 Pivotal 团队维护,它旨在提供一种在分布式环境中管理用户会话的解决方案。...通过合理的配置和实践,我们可以充分利用 Spring Session 实现高效且安全的分布式会话管理。

    Spring中自定义session管理,SpringSession的使用

    本文将详细介绍如何在Spring项目中自定义Session管理以及如何使用SpringSession。 一、SpringSession简介 SpringSession是一个开源项目,它扩展了Spring MVC和Spring WebFlux,以支持基于Redis、MongoDB、Hazelcast...

    分布式会话demo.zip

    7. **Spring Session**:Spring框架提供了一套解决方案——Spring Session,它支持多种后端存储(包括Redis、MongoDB等),可以无缝集成到Spring MVC或Spring Boot应用中,简化了分布式会话的实现。 8. **负载均衡...

    Springboot+SpringSecurity+SpringSession+Redis+Mybatis-Plus+Swwager.zip

    本项目“Springboot+SpringSecurity+SpringSession+Redis+Mybatis-Plus+Swwager”整合了Spring Boot、Spring Security、Spring Session、Redis、Mybatis-Plus以及Swagger等技术,旨在构建一个强大的、安全的、具有...

    springsession管理多台tomcatsession

    SpringSession 是一个强大的框架,它扩展了 Spring Framework 的 Session 支持,允许开发者在分布式环境中管理用户会话。尤其在处理多台 Tomcat 服务器时,SpringSession 提供了一种优雅的方式来实现 session 共享,...

    Spring Session + redis实现session共享

    首先,Spring Session是一个开源项目,由Pivotal Software开发,它扩展了Spring MVC,提供了对HTTP会话(session)的管理支持。Spring Session的核心思想是将session数据从传统的JVM内存中移出,存储到一个独立的...

    SpringSession同时支持Cookie和header策略

    在IT行业中,SpringSession是一个非常重要的工具,它用于在分布式环境中管理HTTP会话。这个工具扩展了Spring框架的功能,使得在集群服务器之间共享session数据变得简单。本文将深入探讨SpringSession如何支持Cookie...

    shiro的session中的会话管理

    在分布式系统或微服务架构中,会话管理成为一个关键问题,因为默认情况下,Shiro的session管理是基于单个服务器的,无法在多台服务器之间共享用户会话信息。 在传统的Web应用中,session信息通常存储在服务器的内存...

    Redis、springSession共享包

    Redis 和 SpringSession 是在分布式系统中管理用户会话(Session)的两个重要工具。Redis 是一个高性能的键值数据存储系统,常用于缓存和消息代理。SpringSession 是 Spring 生态系统的一个扩展,它允许我们在分布式...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    首先,Spring Session是一个用于管理用户会话信息的项目,它能够将用户会话数据存储在外部存储中,而不是存储在服务器的内存中。这对于分布式系统、负载均衡、无状态的微服务架构等场景尤其有用。通过Spring Session...

    Spring Session 2 中文 参考手册 中文文档

    Spring Session是一个为Java平台提供会话管理的库,它提供了一个统一的API和实现用于管理用户会话信息,其核心目的是解决应用程序在分布式系统中处理HTTP会话时可能遇到的常见问题,尤其是在实现集群环境下的会话...

    spring session入门

    Spring Session 是一个为基于Spring应用提供会话管理的开源项目,它使得在分布式环境中处理用户会话变得更加简单。本教程将带你入门Spring Session,并重点探讨其与Redis的整合。 首先,我们来理解Spring Session的...

    spring-session

    此外,Spring Session 还支持在 RESTful API 中使用 JSON Web Tokens (JWT) 进行会话管理。 3. **配置 Spring Session** 配置 Spring Session 需要在 Spring Boot 应用中添加对应的依赖,并在配置文件中指定会话...

    SpringSession+Redis实现Session共享案例

    SpringSession结合Redis实现Session共享是Web开发中一种常见的解决方案,特别是在分布式系统中,为了保持用户在不同服务器之间访问时的会话一致性。本案例旨在教你如何配置和使用SpringSession与Redis来达到这一目的...

    spring-session例子工程

    Spring Session 是一个开源项目,由 Pivotal Software 开发,旨在提供一种在分布式环境中管理用户会话(Session)的方式。这个例子工程展示了如何在实际应用中集成 Spring Session 来实现跨服务器的会话共享,这对于...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    5. **Spring Session框架**:Spring社区提供了一个名为Spring Session的项目,它支持多种后端存储(如Redis、MongoDB等),并且与Spring MVC无缝集成,简化了分布式Session的配置和使用。 6. **HTTP Session Sticky...

    Spring Boot + Spring Session + Redis

    标题 "Spring Boot + Spring Session + Redis" 涉及到的是在Java开发中,使用Spring Boot框架集成Spring Session和Redis来实现会话管理的技术方案。这个解决方案主要解决分布式系统中的session共享问题,使得用户在...

    spring-session+spring+redis的依赖包

    总之,这个压缩包提供的"spring-session+spring+redis"组合,是Java Web开发中实现高可用分布式会话管理的一种常见解决方案。通过使用Redis作为存储,结合Spring Session的便捷性和Jedis的高效访问,可以在复杂环境...

    springboot 项目,基于springsession整合redis实现登录拦截功能

    Spring Session应运而生,它提供了一种在分布式环境中管理Session的解决方案。本项目是基于Spring Boot和Spring Session,结合Redis存储,实现了一个登录拦截功能,确保了在分布式状态下的Session一致性。 Spring ...

    分布式架构下的会话追踪实践【基于Cookie和Redis实现】

    通过以上步骤,我们可以实现一个高效的分布式会话追踪系统,既能保证用户状态的连续性,又能适应大规模的并发请求。同时,利用Cookie和Redis的特性,还能确保系统的安全性和可扩展性。在实际开发中,还可以结合其他...

Global site tag (gtag.js) - Google Analytics