初試spring-session
一、簡介
spring-session提供了用戶會話信息管理的API和實現。
它將取代容器中的HttpSession。在沒有容器會話集群方案的情況下,使得支持會話集群微不足道。
它支持在一個瀏覽器實例中,管理多用戶會話。
接下來,我們將介紹如何在項目中如何使用spring-session。
二、集群session的解決方案
隨著應用訪問量的增大,單臺機器很難支撐,我們就要部署應用集群,對請求進行分流。
但是,這樣就會存在一個問題,集群中的每個應用的session不是共享的,導致訪問出現問題。
1、使用容器中提供的session集群方案。
例如:tomcat自己提供了session集群方案。在集群規模比較小的情況下,各個節點中的session相互進行備份,還是可以的。
但是,如果集群規模比較大,成百上千臺,他們節點之間的備份將是非常耗資源的,只適合小規模集群。
2、session統一存儲
既然容器中的復制不是一個好的選擇,我們可以將session後臺統一存儲,例如:存儲到數據庫或緩存中。
spring-session為我們提供了各種存儲方式的解決方案,mysql,redis,mongo等。這裏我們只介紹redis存儲,其他方式請參考官方文檔。
三、項目中使用spring-session
1、在項目的pom.xml中加入spring-session-redis的jar包,在項目的pom.xml文件中加入如下配置:
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.2.2.RELEASE</version> <type>pom</type> </dependency>
2、在項目的spring配置文件中加入如下配置:
<context:annotation-config/>
<bean id="cookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"> <property name="cookiePath" value="/"/> <property name="useHttpOnlyCookie" value="false"/> <!--cookie有效期 單位:秒--> <property name="cookieMaxAge" value="1800"/> <property name="domainName" value="${your_domain}"/> <property name="cookieName" value="${your_cookie_name}"/> </bean> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="cookieSerializer" ref="cookieSerializer"/> <property name="maxInactiveIntervalInSeconds" value="1800"/> </bean> <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="192.168.2.233"/> <property name="port" value="6379"/> <property name="database" value="0"/> </bean>
在這裏,容器啟動時將生成一個springSessionRepositoryFilter,它實現了Filter接口,它負責將HttpSession替換成SpringSession,並將其存儲在redis中。
spring-session是使用RedisConnectionFactory
連接redis的,所以我們創建JedisConnectionFactory
。使用spring-redis的高級配置請參考spring-data-redis文獻。
maxInactiveIntervalInSeconds是Session在redis中的過期時間,這個時間通常與cookie的有效期配置成一樣。
在cookieSerializer中,可以配置cookie的相關信息,域名,cookie名稱,httpOnly等。
3、在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> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
在web.xml中配置過濾器,攔截將所有的請求攔截,通過springSessionRepositoryFilter將HttpSession替換成SpringSession。
這樣,所有的Session都存儲到redis中,並且從redis讀取,實現了Session的集中管理,又使得應用可以搭建集群。
作者原創,如有不妥之處,還請見諒
初試spring-session