1. 程式人生 > >Spring Session在Spring MVC中的使用.md

Spring Session在Spring MVC中的使用.md

存在 現在 classpath del 毫秒 hold -s cluster eas

  1. Web項目會通過Session進行會話保持,Session是保存在服務器內存中;
  2. 現在為了提高站點的性能和穩定性,將Web項目發布到多個服務器,通過代理如Nginx或F5做負載均衡;
  3. 由於負載均衡正常配置,會對客戶端的請求隨機轉發到某一個服務器,這會導致Session丟失;
  4. 解決方案:一種是可將代理如Nginx或F5配置為高可用,即用戶訪問時,在同一會話期間內,只往一臺服務器轉發;另一種是引入Spring Session,對Session進行持久化、統一管理;
  5. Spring Session對Session進行了透明封裝,可將原本通過Session存在內存的數據,持久化到redis等緩存數據庫中,實現Session的持久化和統一管理,且開發人員只要引入Spring Session,使用時依舊跟平時用Session操作時一樣;

官方文檔:https://spring.io/projects/spring-session

以下記錄Spring MVC中采用Spring Session+redis的實現方案。

第一步:pom配置引入依賴包

        <!-- spring session依賴包 -->
        <!-- Spring Data Redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.3.RELEASE</version>
        </dependency>
        <!-- Spring Session -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session</artifactId>
            <version>1.2.2.RELEASE</version>
        </dependency>
        <!-- Apache Commons Pool -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.2</version>
        </dependency>

第二步:配置spring-mvc.xml:

    <!-- 通過配置文件掃描獲取詳細的配置信息 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:app.properties"/>
    </bean>

    <!--新增spring-session配置-->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
    <!--<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">-->
        <!--<property name="hostName" value="localhost" />-->
        <!--<property name="password" value="your-password" />-->
        <!--<property name="port" value="6379" />-->
        <!--<property name="database" value="10" />-->
    <!--</bean>-->
    <!--JedisConnectionFactory -->
    <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg index="0">
            <bean class="org.springframework.data.redis.connection.RedisClusterConfiguration">
                <constructor-arg index="0">
                    <set>
                        <value>${REDIS.CLUSTERS}</value>
                    </set>
                </constructor-arg>
                <property name="maxRedirects" value="5" />
            </bean>
        </constructor-arg>
        <constructor-arg index="1">
            <!-- redis緩存配置 -->
            <bean class="redis.clients.jedis.JedisPoolConfig">
                <property name="maxIdle" value="6000" /><!-- 最大空閑時間 -->
                <property name="maxWaitMillis" value="1500"/><!-- 獲得鏈接時的最大等待毫秒數,小於0:阻塞不確定時間,默認-1 -->
                <property name="testOnBorrow" value="true" /><!-- 在獲得鏈接的時候檢查有效性,默認false -->
                <property name="testOnReturn" value="true" />
            </bean>
        </constructor-arg>
    </bean>
    <!-- 讓Spring Session不再執行config命令 -->
    <util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>

第三步:配置web.xml:

  <!-- 配置spring session -->
  <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>

碰到問題

報錯:

org.springframework.data.redis.serializer.SerializationException: Cannot serialize;

解決方案:
要緩存的JavaBean需要實現Serializable接口,因為Spring會將對象先序列化再存入Redis,針對於此異常,修改對應的JavaBean對象即可,實現Serializable:

public class SessionUser implements Serializable {
}

PS:所以session所調用的JavaBean對象都要實現Serializable,否則反序列化就會出錯;

Spring Session在Spring MVC中的使用.md