1、工做中由於要使用到Tomcat集羣部署,此時就涉及到了Session共享問題,主要有三種解決方案:
html
一、使用數據庫來存儲Sessionjava
二、使用Cookie來存儲Sessionnginx
三、使用Redis來存儲Sesssiongit
2、本文中主要講一下第3種方案,也就是使用Redis來存儲Session,Github中已經有該開源組件(tomcat-redis-session-manager),下面講一下配置的步驟github
一、配置tomcat配置文件context.xml
web
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="localhost" <!-- Redis地址 --> port="6379" <!-- Redis端口 --> password="123456" <!-- Redis密碼 --> database="0" <!-- 存儲Session的Redis庫編號 --> maxInactiveInterval="60" <!-- Session失效的間隔(秒) --> />
注:redis
1)Manager節點中的className屬性爲必選項,其它均爲可選項shell
2)maxInactiveInterval設置不生效,暫時找不到緣由,在部署中發現Session失效的間隔一直都是讀取tomcat/conf/web.xml中的session-config節點中配置的session-timeout屬性值,且都是以秒爲單位(若有知道問題緣由所在的,麻煩告訴我一聲,很是感謝)數據庫
二、添加相關的jar包到tomcat/lib目錄下,須要的jar包以下:tomcat
commons-pool2-2.2.jar jedis-2.5.2.jar tomcat-redis-session-manage-tomcat7.jar
注:
1)我將這些jar包上傳到了百度雲盤中,有須要的能夠點擊下載:http://pan.baidu.com/s/1bokMOVH
三、在nginx中配置負載均衡,配置文件爲nginx.conf
http { upstream myServer { server 192.168.1.2:8080; server 192.168.1.3:8080; } server { listen 80; server_name www.kolbe.cn; location / { proxy_pass http://myServer; } }
配置完後,訪問www.kolbe.cn的請求都將被轉發到192.168.1.2:8080以及192.168.1.3:8080中去,能夠在頁面中打印一下Session Id驗證一下
Session Id : <%= request.getSession().getId() %>
固然,也能夠到Redis庫中直接查看
注:
1)GitHub中該開源組件(tomcat-redis-session-manager)的主頁:https://github.com/jcoleman/tomcat-redis-session-manager
2)該組件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本
3)在程序中將對象放到Redis裏時,該對象必須實現java.io.Serializable接口,不然將報錯,若是對象中有其它對象的引用,該引用對象也需實現java.io.Serializable接口,因此在使用request.getSession().setAttribute()方法時,必定要注意一下這一個細節