Spring Session边学边写(二)使用xml配置

在团队项目中我们可能使用了xml配置而非注解配置,而在xml配置中加入spring session是很简单的。

1.加入依赖库
按照上一章步骤加入spring session依赖库
2.配置session repository filter
在web.xml中尽量靠前的位置加入配置
	<!-- tag::springSessionRepositoryFilter[] -->
	<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>
	<!-- end::springSessionRepositoryFilter[] -->

可以放在<context-param>和<listener>配置下的第一个<filter>。
如果项目中已经使用了spring security,会有以下配置
	<!-- spring security filter -->
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

则需要确定springSessionRepositoryFilter的配置在springSecurityFilterChain之前。
3.配置spring session及redis
在spring配置文件中加入以下内容
	<!-- tag::beans[] -->
	<context:annotation-config/>
	<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
	<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="port" value="6379"/>
		<property name="hostName" value="192.168.24.31"/>
	</bean>
	<!-- end::beans[] -->

第一二行会启用redis存储session并使用自带注释声明。
jedisConnectionFactory则配置远程redis缓存集群地址。
4.部署测试
使用上一章的index.jsp和SessionServlet进行测试,可看到session实现已替换。
停止并重新启动tomcat后session也不会丢失。
5.优缺点
spring session不依赖于web容器实现,一个会话跨tomcat、jboss都可以使用。
但因为每次请求处理前都要从远程缓存读取会话,并在处理后将会话写回缓存,所以访问速度严重依赖于内部网络及redis并发访问速度。且一旦redis停止服务,所有会话将无法访问,也不能创建新的会话。
对比其他web容器自身实现的会话共享(如jboss的基于本虚拟机infinispan缓存搭建集群的会话复制,或基于远程datagrid缓存集群的会话共享),在性能、稳定性上可能会有差异。

猜你喜欢

转载自sb33060418.iteye.com/blog/2250214