Spring Session在Spring MVC中的使用.md
阿新 • • 發佈:2018-07-25
存在 現在 classpath del 毫秒 hold -s cluster eas
- Web項目會通過Session進行會話保持,Session是保存在服務器內存中;
- 現在為了提高站點的性能和穩定性,將Web項目發布到多個服務器,通過代理如Nginx或F5做負載均衡;
- 由於負載均衡正常配置,會對客戶端的請求隨機轉發到某一個服務器,這會導致Session丟失;
- 解決方案:一種是可將代理如Nginx或F5配置為高可用,即用戶訪問時,在同一會話期間內,只往一臺服務器轉發;另一種是引入Spring Session,對Session進行持久化、統一管理;
- 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