前言:
nginx实现提供了Ip_hash的方式实现了tomcat的集群,但未实现session的同步,当被分配的tomcat节点挂掉了,改系统的session信息将丢失,因此选用以下两种方式。
1.tomcat Cluster实现session同步,这种方式是通过多个节点间定时的同步每个节点session中的信息来实现session同步的,这种效率低,同时依赖tomcat这种平台,不推荐使用,如果大家需要使用,tomcat 的 \webapps\docs\cluster-howto.html文件提供了实现session同步的配置方法,大家可以参看,那么是否存在一种可以解决夸平台,同时与代码的耦合度低的session同步的方式呢,大家请继续看spring-session搭建session同步.
2.Spring-Session搭建tomcat节点间session同步,具体配置如下。
pom.xml相关配置
<!--spring session redis-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
spring ioc中的配置:
<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="600"/>
</bean>
<!--redis 连接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100" />
<property name="maxIdle" value="10" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
<property name="hostName" value="${redis.host}"/>
<property name="port" value="${redis.port}"/>
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}"/>
<property name="usePool" value="${redis.usePool}"/>
<property name="poolConfig" ref="jedisPoolConfig"/>
</bean>
web.xml中的配置:
<!--配置springsession过滤器-->
<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是将session信息保存在redis中,多个节点同时公用redis中的session信息,以达到session同步的目的,因此在配置完成后一定要保证redis的服务端是启动的。