1. 程式人生 > >初試spring-session

初試spring-session

patch strong nco main rep disco erro seconds repo

一、簡介

  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