- Spring Session
- Redis
訪問Spring Session官方網(wǎng)站:
在百度中查詢Spring Session即可找到Spring Session的官方站點。
目前版本為1.0.2,1.0.3版本處于snapshot狀態(tài)。
Spring指出,Spring Session具有如下能力:
(1) API and implementations for managing a user's session
(2) HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way
(2-1)Clustered Sessions - Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution.
(2-2)Multiple Browser Sessions - Spring Session supports managing multiple users' sessions in a single browser instance (i.e. multiple authenticated accounts similar to Google).
(2-3)RESTful APIs - Spring Session allows providing session ids in headers to work with RESTful APIs
(3) WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages
對Spring Session有了基本了解之后,可以開始配置Maven的pom.xml,導(dǎo)入SpringSession的jar包
Spring官方文檔指出,要使用Spring Session,配置如下依賴即可:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
實際上,spring-session-data-redis并不是一個實際的jar包,只不過它配置了其他的四個依賴:
Spring-session-data-redis是一個空的包,我們可以從如下截圖中看出。Spring-session-data-redis僅僅只有一個META-INF文件夾。它的作用就在于引入其他四個包。
當(dāng)然,實際上你也可以不配置spring-session-data-redis,而直接配置實際上導(dǎo)入的類:
<!-- Redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.2</version>
</dependency>
<!-- Spring Session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.2</version>
</dependency>
我們這里,首先,配置spring-data-redis和jedis,這樣,就可以使用spring-data-redis框架,來實現(xiàn)訪問redis數(shù)據(jù)庫。
spring-data-redis是spring的一個子項目,和spring-session一樣。spring-session要訪問redis,這里spring-session依賴spring-data-redis,來實現(xiàn)操作reids數(shù)據(jù)庫。
Spring Core、Spring Web需要配置4.x版本。
當(dāng)然,Spring Session還需要把Spring Web等常見的Spring包引入。Spring Session 1.0.2依賴Spring的版本為4.1.6以上,因此,3.x版本的Spring是無法使用的:
可以從Maven Repository查看依賴情況:http://mvnrepository.com/artifact/org.springframework.session/spring-session/1.0.2.RELEASE
此外,注意javax.servlet-api需要3.0.1版本以上。
配置application-context.xml文件
這里,我們以使用xml配置方式為例,當(dāng)然也可以使用注解配置,詳見SPring的官方例子(見參考資料)
備注:xml的配置方法官方給出了一個例子:http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/guides/httpsession-xml.html
在application-context.xml文件中,加入:
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" />
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
其中,${redis.host}等即redis數(shù)據(jù)庫的服務(wù)器地址,端口,密碼等信息,放在properties文件中即可。
修改web.xml,加入Spring Session的Filter
在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>
這樣,所有的請求,都會被DelegatingFilterProxy處理,實際上,DelegatingFilterProxy會找到springSessionRepositoryFilter,創(chuàng)建它。每一次的請求還是由springSessionRepositoryFilter來過濾的。
The DelegatingFilterProxy will look up a Bean by the name of springSessionRepositoryFilter and cast it to a Filter. For every request that DelegatingFilterProxy is invoked, the springSessionRepositoryFilter will be invoked.
這里,Spring加入了一個Filter,其本質(zhì)是:對每一個請求的request進行了一次封裝。那么,在Controller里面拿出的request實際上是封裝后的request,
調(diào)用request.getSession()的時候,實際上拿到是Spring封裝后的session。這個session則存儲在redis數(shù)據(jù)庫中。
訪問Web項目,查看session
訪問Web項目,這個時候,使用redis-cli進入redis命令操作界面,在使用keys *可以查看所有的key:
第一個是當(dāng)前訪問的用戶的session信息,第二個保存的是過期的時間。
可以查看session的詳細(xì)內(nèi)容如下:
可以看出,session對象被序列化后存入。因此,所有放入session的對象,都要實現(xiàn)Serializable接口。比如,我將所有的用戶信息,封裝到一個Authentication對象,那么
這對象就必須實現(xiàn)Serializable接口:
補充一下:
如果要設(shè)置Session的過期時間,通常我們會在web.xml文件中進行設(shè)置:
但是,使用Spring Session托管session后,這里的設(shè)置將會失效。我們要專門為Spring Session進行設(shè)置:
將application-context.xml,即步驟4中的的RedisHttpSessionConfiguration,設(shè)置其maxInactiveIntervalInSeconds屬性即可。注意,maxInactiveIntervalInSeconds的的單位是秒! 如下將設(shè)置session為10分鐘過期!
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="600"></property>
</bean>