`
beichen35
  • 浏览: 3730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

零配置文件利用spring-session实现集群session共享

 
阅读更多

普通单服务器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共享实现步骤

    通过以上步骤,你已经成功地配置了Spring和Redis来实现Session共享。需要注意的是,虽然文档中提到的配置可能只适用于非集群的Redis环境,但配置文件名为`spring-redis-cluster.xml`,这可能意味着配置也支持Redis...

    spring-session-1.3.1.RELEASE.zip

    首先,Spring Session 提供了跨多个服务器的会话共享能力,这意味着即使用户在不同的服务器之间切换,他们的会话状态也能保持一致。这在基于负载均衡的集群环境中至关重要,因为它消除了单点故障,并允许更灵活的...

    spring-session+spring+redis的依赖包

    3. **Spring Session-1**:这是Spring Session的主要版本,它为Spring MVC和Spring WebFlux提供会话管理支持。它定义了接口和实现,以便将会话数据存储在不同的后端,如In-Memory、 JDBC、MongoDB、Hazelcast或Redis...

    spring-session例子工程

    这个例子工程展示了如何在实际应用中集成 Spring Session 来实现跨服务器的会话共享,这对于运行在集群环境下的 Web 应用来说非常有用。 在传统的 Web 应用中,Session 数据通常存储在单个服务器的内存中,当应用...

    spring-session

    配置 Spring Session 需要在 Spring Boot 应用中添加对应的依赖,并在配置文件中指定会话存储后端(如 Redis)。例如,对于 Redis,需要配置 Redis 连接信息,并启用 Spring Session 的 Redis 支持。 4. **使用 ...

    spring-session+spring的依赖包

    本项目是一个基于Spring Session和Redis Cluster的Java Maven演示应用,旨在展示如何实现基于Redis集群的session共享。 1. **Spring Session**: - Spring Session允许开发者在不同的服务器之间共享用户会话,这...

    spring session实现session共享

    Spring Session 是一个开源项目,由 Pivotal Software 开发,旨在提供一种在分布式环境中实现Session共享的解决方案。在传统的Web应用中,Session信息通常存储在单个服务器的内存中,当应用部署在集群或者分布式环境...

    Spring Session + redis实现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共享" 指的是在分布式环境中,通过 memcached-session-manager 这个工具来实现 Tomcat 应用服务器之间的 Session 共享。Session 是 Web 应用中用于存储用户状态...

    Springboot实现多服务器session共享

    Springboot实现多服务器...Springboot提供了自动化session共享配置,需要添加spring-session-data-redis依赖项,Spring Session可以做到透明的替换掉应用中的Session容器。下面是一个基本的pom.xml配置文件: ```xml ...

    配置tomcat-redis-session共享架包

    "配置tomcat-redis-session共享架包"的目的是实现Tomcat服务器与Redis缓存系统之间的session共享,以便于在分布式环境下维持用户的会话状态。在这个场景中,Tomcat8作为一个流行的Java Servlet容器,而Redis则作为高...

    SpringSession同时支持Cookie和header策略

    SpringSession通过配置可以选择使用特定的头部名称来传输session信息。 现在,我们来看看`CookieHeaderHttpSessionStrategy.java`这个文件。这个类是SpringSession实现上述策略的关键组件,它继承自`...

    基于spring-cloud分布式session共享文档

    ##### 方案二:Tomcat集群Session复制 - **原理**:利用Tomcat内置的Session复制机制,将Session数据同步到集群中的其他节点。 - **优点**: - 零代码改造,直接利用Tomcat自带的功能实现; - 适用于小规模集群。 ...

    spring Session与Redis的jar包

    这些jar包可能包括`spring-session-data-redis`,`spring-boot-starter-data-redis`,以及Redis客户端库(如`lettuce`或`jedis`)。 2. **配置Redis连接**:接着,需要在Spring Boot的配置文件(如`application....

    spring-session:spring session+redis实现分布式缓存

    2. **配置Spring Session**: 在Spring配置文件中启用Spring Session并指定Redis作为session存储。 ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    tomcat集群利用redis实现session共享所需jar包

    - `spring-session-data-redis.jar`:Spring Session项目提供的Redis适配器,用于在Spring应用中实现Session共享。 - `spring-webmvc.jar`:Spring Web MVC框架,处理HTTP请求和响应。 - 可能还有其他依赖,如...

    tomcat-redis-session需要的jar包

    - `tomcat-redis-session-manager.jar`:这是核心的session管理器实现,负责与Redis交互。 - `jedis.jar`:Jedis是Java的一个Redis客户端,用于连接和操作Redis服务器。 - `slf4j-api.jar` 和 `slf4j-simple.jar`...

    详解SpringBoot2 使用Spring Session集群

    详解SpringBoot2 使用Spring Session集群 SpringBoot2 是一个流行的 Java 框架,用于构建基于 Web 的应用程序,而 Spring Session 是一个用于管理会话的框架。本文将详细介绍如何使用 Spring Session 在 SpringBoot...

    springboot +shiro+redis实现session共享(方案二)1

    "Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...

Global site tag (gtag.js) - Google Analytics