spring session解决集群环境下session共享问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Howie_zhw/article/details/78284603

1.共享session问题

HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。而如果我们把web服务器搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到两个不同的web站点中去。那么问题就来了,如何保证不同的web站点能够共享同一份session数据呢?


最简单的想法就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。那么问题又来了,如何替换掉Servlet容器创建和管理HttpSession的实现呢?

设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。spring-session就是通过这样的思路实现的。

2.spring session介绍

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

Spring Session提供了一套创建和管理Servlet HttpSession的方案。Spring Session提供了集群Session(Clustered Sessions)功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。

3.spring session配置步骤

3.1 maven配置文件

<dependency>
		    	<groupId>org.springframework.session</groupId>
		   		<artifactId>spring-session-data-redis</artifactId>
		    	<version>1.3.0.RELEASE</version>
		   		<exclusions>
		   			<exclusion>
		   				<groupId>redis.clients</groupId>  
    					<artifactId>jedis</artifactId>  
		   			</exclusion>
		   			<exclusion>
		   				<groupId>org.springframework.data</groupId>
    					<artifactId>spring-data-redis</artifactId>
		   			</exclusion>
		   		</exclusions>
			</dependency>
 			<dependency>
		    	<groupId>org.springframework.data</groupId>
		    	<artifactId>spring-data-redis</artifactId>
		   	 	<version>1.5.0.RELEASE</version>
			</dependency>
<dependency>
				<groupId>redis.clients</groupId>
				<artifactId>jedis</artifactId>
				<version>2.8.0</version>
			</dependency>

3.2 web.xml配置文件

<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>

3.3 applicationContext.xml配置文件


  	<bean id="sessionJedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
         <property name="maxIdle" value="16" />
         <property name="minIdle" value="4" />
         <property name="testOnBorrow" value="true" />
         <property name="testOnReturn" value="true" />
         <property name="testWhileIdle" value="true" />
         <property name="numTestsPerEvictionRun" value="4" />
         <property name="timeBetweenEvictionRunsMillis" value="3000" />
    </bean>
	
	 <bean id="sentinelConfig"   class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <constructor-arg name="propertySource" ref="mapPropertySource" />
     </bean>
     
	<bean id="mapPropertySource" class="org.springframework.core.env.MapPropertySource">
		<constructor-arg name="name" value="mapPropertySourceName" />
        <constructor-arg name="source" >
        	<map>
        		<entry key="spring.redis.sentinel.master" value="mymaster" />
        		<entry key="spring.redis.sentinel.nodes" value="192.168.18.2:26379,192.168.18.3:26379,192.168.18.4:26379" />
        	</map>
        </constructor-arg>
	</bean>
	<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<constructor-arg ref="sentinelConfig" />
        <constructor-arg ref="sessionJedisPoolConfig" />
	</bean>
	<bean id="sessionStringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    	<property name="connectionFactory" ref="jedisConnectionFactory" />
	</bean>
 
	<bean id="redisHttpSessionConfiguration"
		class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
	    <property name="maxInactiveIntervalInSeconds" value="1800" /> 
	    <property name="redisNamespace" value="test"></property>
	</bean> 







展开阅读全文

没有更多推荐了,返回首页