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缓存集群的会话共享),在性能、稳定性上可能会有差异。