普通单服务器web应用中,Session都是由容器管理,存放到内存中。如果搭建分布式集群,就需要保证
各个服务器中所使用的Session一致。比较简单的方式就是设计一个Filter,利用HttpServletRequestWrapper,
直接将Session换成自己管理。这也就是spring-session的设计思路。
1、介绍
GitHub地址:https://github.com/spring-projects/spring-session
2、简单实例
1)增加依赖jar
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.5.2</version> </dependency> <!-- Spring Session --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.2.0.RELEASE</version> <type>pom</type> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
2)编写一个配置类,用来启用RedisHttpSession功能,并向Spring容器中注册一个RedisConnectionFactory,并增加session监听器
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3000) public class Config { @Bean public JedisConnectionFactory connectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster") .sentinel("192.168.191.11", 26379).sentinel("192.168.191.11", 26479).sentinel("192.168.191.11", 26579); JedisConnectionFactory jcf = new JedisConnectionFactory(sentinelConfig); jcf.setPassword("123456"); return jcf; } /** * 自定义session监听器 * @return */ @Bean public ApplicationListener sessionListener(){ return new SessionListener(); } }
由于不再使用web容器所管理的session,原有通过web.xml中增加配置设置session时效,及session监听的方式也不再适用。可使用maxInactiveIntervalInSeconds来设置session失效时间,单位(秒)。
3)由于spring-session将session的事件注册到ApplicationEvent中,可以使用自定监听器用来监听
public class SessionListener implements ApplicationListener<AbstractSessionEvent> { @Override public void onApplicationEvent(AbstractSessionEvent event) { if (event instanceof SessionCreatedEvent) { System.out.println("创建session"); } if (event instanceof SessionDestroyedEvent) { System.out.println("销毁session"); } } }
4)将RedisHttpSessionConfig及监听器加入spring容器中
public class Initializer extends AbstractHttpSessionApplicationInitializer { public Initializer() { super(Config.class); } }
5)测试servlet
@WebServlet("/session") public class SessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().setAttribute("A", "test"); resp.sendRedirect(req.getContextPath() + "/"); } private static final long serialVersionUID = 2878267318695777395L; }
启动工程,访问servlet地址。
Http Session数据在Redis中是以Hash结构存储的。
127.0.0.1:6379> keys * 1) "spring:session:expirations:1431577740000" 2) "spring:session:sessions:e2cef3ae-c8ea-4346-ba6b-9b3b26eee578"
可以看到,还有一个key="spring:session:expirations:1431577740000"的数据,是以Set结构保存的。这个值记录了所有session数据应该被删除的时间(即最新的一个session数据过期的时间)。
6)需要注意的就是redis需要2.8以上版本,然后开启事件通知,在redis配置文件里面加上
notify-keyspace-events Ex
相关推荐
通过以上步骤,你已经成功地配置了Spring和Redis来实现Session共享。需要注意的是,虽然文档中提到的配置可能只适用于非集群的Redis环境,但配置文件名为`spring-redis-cluster.xml`,这可能意味着配置也支持Redis...
首先,Spring Session 提供了跨多个服务器的会话共享能力,这意味着即使用户在不同的服务器之间切换,他们的会话状态也能保持一致。这在基于负载均衡的集群环境中至关重要,因为它消除了单点故障,并允许更灵活的...
3. **Spring Session-1**:这是Spring Session的主要版本,它为Spring MVC和Spring WebFlux提供会话管理支持。它定义了接口和实现,以便将会话数据存储在不同的后端,如In-Memory、 JDBC、MongoDB、Hazelcast或Redis...
这个例子工程展示了如何在实际应用中集成 Spring Session 来实现跨服务器的会话共享,这对于运行在集群环境下的 Web 应用来说非常有用。 在传统的 Web 应用中,Session 数据通常存储在单个服务器的内存中,当应用...
这些jar包可能包括`spring-session-data-redis`,`spring-boot-starter-data-redis`,以及Redis客户端库(如`lettuce`或`jedis`)。 2. **配置Redis连接**:接着,需要在Spring Boot的配置文件(如`application....
配置 Spring Session 需要在 Spring Boot 应用中添加对应的依赖,并在配置文件中指定会话存储后端(如 Redis)。例如,对于 Redis,需要配置 Redis 连接信息,并启用 Spring Session 的 Redis 支持。 4. **使用 ...
本项目是一个基于Spring Session和Redis Cluster的Java Maven演示应用,旨在展示如何实现基于Redis集群的session共享。 1. **Spring Session**: - Spring Session允许开发者在不同的服务器之间共享用户会话,这...
Spring Session 是一个开源项目,由 Pivotal Software 开发,旨在提供一种在分布式环境中实现Session共享的解决方案。在传统的Web应用中,Session信息通常存储在单个服务器的内存中,当应用部署在集群或者分布式环境...
确保包含spring-session-data-redis、spring-boot-starter-data-redis以及相应的版本。 2. **配置Redis连接**:在application.properties或application.yml文件中设置Redis的连接信息,如主机名、端口、密码等。 3...
标题 "memcached-session-manager 实现 tomcat session共享" 指的是在分布式环境中,通过 memcached-session-manager 这个工具来实现 Tomcat 应用服务器之间的 Session 共享。Session 是 Web 应用中用于存储用户状态...
Springboot实现多服务器...Springboot提供了自动化session共享配置,需要添加spring-session-data-redis依赖项,Spring Session可以做到透明的替换掉应用中的Session容器。下面是一个基本的pom.xml配置文件: ```xml ...
"配置tomcat-redis-session共享架包"的目的是实现Tomcat服务器与Redis缓存系统之间的session共享,以便于在分布式环境下维持用户的会话状态。在这个场景中,Tomcat8作为一个流行的Java Servlet容器,而Redis则作为高...
SpringSession通过配置可以选择使用特定的头部名称来传输session信息。 现在,我们来看看`CookieHeaderHttpSessionStrategy.java`这个文件。这个类是SpringSession实现上述策略的关键组件,它继承自`...
##### 方案二:Tomcat集群Session复制 - **原理**:利用Tomcat内置的Session复制机制,将Session数据同步到集群中的其他节点。 - **优点**: - 零代码改造,直接利用Tomcat自带的功能实现; - 适用于小规模集群。 ...
2. **配置Spring Session**: 在Spring配置文件中启用Spring Session并指定Redis作为session存储。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
- `spring-session-data-redis.jar`:Spring Session项目提供的Redis适配器,用于在Spring应用中实现Session共享。 - `spring-webmvc.jar`:Spring Web MVC框架,处理HTTP请求和响应。 - 可能还有其他依赖,如...
- `tomcat-redis-session-manager.jar`:这是核心的session管理器实现,负责与Redis交互。 - `jedis.jar`:Jedis是Java的一个Redis客户端,用于连接和操作Redis服务器。 - `slf4j-api.jar` 和 `slf4j-simple.jar`...
详解SpringBoot2 使用Spring Session集群 SpringBoot2 是一个流行的 Java 框架,用于构建基于 Web 的应用程序,而 Spring Session 是一个用于管理会话的框架。本文将详细介绍如何使用 Spring Session 在 SpringBoot...
"Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...