1. 程式人生 > >spring session + redis 實現web工程的session共享

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是不斷的在切換的。