Spring MVC 使用 Spring Session 實現 Session 共享-Redis
阿新 • • 發佈:2019-01-05
使用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 中