spring session + redis 實現web工程的session共享
關於session共享,在網上有很多文章,但是很少有文章是別人看過了,能夠實際操作就能實現出來的,我不知道是文章寫的漏掉了什麼還是什麼原因,可能是我的能力還達不到文章所需要的能力要求吧。先不管那麼多了,我就以我實際配置安裝部署的例項來講述下我的實現session共享的方式吧。
文章開始之前,先講點小插曲。一開始我是想不對程式做任何改動的情況下,只通過nginx+tomcat+redis的方式進行實現session共享,實際配置之後,用簡單的測試session的一個jsp頁面進行測試,的確看得出session是共享的。但是當真正部署上我的web工程(spring+springMVC+mybatis)之後,發現session並不能共享,session的內容也不往redis裡輸出,找不出什麼原因,最終放棄了這種做法,決定用spring自帶的session管理藉助redis來實現session共享,此操作只需要改些配置,改jar包,不需要改動業務程式碼。
首先,明確一下環境要求:windows系統,1.7jdk,tomcat7,使用spring-session,要求spring的相關依賴包必須是spring4.0以上,redis要求是3.0以上。專案工程中除了spring基礎的一些核心包之外,需要額外引入commons-pool2-2.4.2.jar,jedis-2.7.3.jar,spring-data-redis-1.6.2.RELEASE.jar,spring-session-1.1.1.RELEASE.jar,相應的版本號也給出了,起碼這些版本的jar包在一起使用,是相互相容可用的,我不敢保證其他版本的jar包引入之後會不會有什麼問題,大家有興趣可以嘗試一下其他版本的。
在此也貼一下spring+session相關jar包的下載地址:http://download.csdn.net/detail/sdmanooo/9755249。
redis3.0的下載地址:http://download.csdn.net/detail/sdmanooo/9755259 下載解壓之後,在目錄中執行cmd,執行redis-server.exe redis.windows.conf 進行啟動redis,不能直接雙擊redis-server.exe,否則不讀取conf配置。
其實整個過程梳理一下也很簡單。
一、工程要整合spring-session
1.引入所需的jar包
2.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>
網上有說如果有其他的filter需要將此段程式碼放到所有filter的前面,其實沒這個必要。
3. applicationContext.xml中新增
<!-- session設定 -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="3600"></property>
</bean>
<!-- redis連線池 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
<!-- redis連線工廠 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1"/>
<property name="port" value="6379"/>
<property name="password" value=""/>
<property name="timeout" value="20000"/>
<property name="poolConfig" ref="poolConfig"></property>
</bean>
由於我是本地的redis,也沒有設定密碼,所以是127.0.0.1,埠預設6379,可根據redis的地址自行調整。
至此,程式的session共享已經完成,只要保證能正常啟動即可,啟動時,需要redis先啟動,否則會報錯。
二、搭建叢集環境測試
1. 配置nginx
我的兩個tomcat的埠分別是20001和21001,所以nginx的配置如下:
upstream local_tomcat{
server 127.0.0.1:20001 weight=5;
server 127.0.0.1:21001 weight=5;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://local_tomcat;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
nginx根目錄下啟動cmd,執行start nginx 即可啟動nginx。可從程序中檢視nginx是否正常啟動。
2. 測試session
可以在工程的主頁面上輸出一下<%= session.getId() %>,
為了區分tomcat,我在20001tomcat下的工程的主頁面上還輸出了1111
21001tomcat下工程的主頁面上輸出了2222。
在瀏覽器中,訪問localhost/工程名/主頁面
不停的F5重新整理頁面,即可看到<%= session.getId() %>的值是不變的,但是tomcat是不斷的在切換的。