1. 程式人生 > >Spring MVC 使用 Spring Session 實現 Session 共享-Redis

Spring MVC 使用 Spring Session 實現 Session 共享-Redis

使用Spring Session 通過 Redis 實現 Session 共享,用於多例項應用

Session 共享的簡單原理

使用者第一次訪問應用時,應用會建立一個新的 Session,並且會將 Session 的 ID 作為 Cookie 快取在瀏覽器,下一次訪問時請求的頭部中帶著該 Cookie,應用通過獲取的 Session ID 進行查詢,如果該 Session 存在且有效,則繼續該請求,如果 Cookie 無效或者 Session 無效,則會重新生成一個新的 Session

在普通的 JavaEE 應用中,Session 資訊放在記憶體中,當容器(如 Tomcat)關閉後,記憶體中的 Session 被銷燬;重啟後如果當前使用者再去訪問對應的是一個新的 Session ,在多例項中無法共享,一個使用者只能訪問指定的例項才能使用相同的 Session;

Session 共享實現的原理是將原來記憶體中的 Session 放在一個需要共享 Session 的例項都可以訪問到的位置,如資料庫,Redis 中等,從而實現多例項 Session 共享

實現共享後,只要瀏覽器的 Cookie 中的 Session ID 沒有改變,多個例項中的任意一個被銷燬不會影響使用者訪問

Redis 方式實現

將 Session 物件序列化儲存到 Redis 中,多個例項訪問時都會使用該 Session,Spring Session 會管理 Session 資訊的管理,無需其他操作

1. 新增依賴

  • 在 pom.xml 檔案裡面新增如下依賴
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId
>
<artifactId>spring-data-redis</artifactId> <version>1.8.7.RELEAS</version> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.1.RELEASE</version> </dependency>

2. 新增配置

  • SpringConfig.xml 新增如下配置
    <!-- 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="123456"/>
        <property name="port" value="6379"/>
        <property name="database" value="3"/>
    </bean>

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>
    </filter-mapping>

該過濾器必須是第一個過濾器,所有的請求經過該過濾器後執行後續操作

  • Session 資訊
    這裡寫圖片描述

  • Session 中的值以二進位制資訊儲存在 Redis 中
    這裡寫圖片描述