集群解決 session共享問題幾種方式
一、集群環境session共享
1、利用負載均衡器的粘session的方式把所有同一session的請求都發送到相同的Tomcat節點。這樣不同用戶的請求就被平均分配到集群中各 個tomcat節點上,實現負載均衡的能力。這樣做的缺點是沒有災難恢復的能力。一旦一個節點發生故障,這個節點上所有的session信息全部丟失;
2、利用Tomcat session復制的機制使得所有session在所有Tomcat節點中保持一致。當一個節點修改一個session數據的時候,該節點會把這個 session的所有內容序列化,然后廣播給所有其它節點。這樣當下一個用戶請求被負載均衡器分配到另外一個節點的時候,那個節點上有完備的 session信息可以用來服務該請求。這種做法的問題是對session哪怕有一點點修改,也要把整個sessions數據全部序列化 (serialize),還要廣播給集群中所有節點,不管該節點到底需不需要這個session。這樣很容易會造成大量的網絡通信,導致網絡阻塞。一般采 用這種方式,當Tomcat節點超過4個時候,整個集群的吞吐量就不能再上升了;
3、第三種方式是通過cookie保存用戶信息的一個或幾個關鍵字,每一個http請求到達web應用的時候,web程序拿這個關鍵字到數據庫中讀取相關 的數據,然后對其進行處理。也就是說把session數據保存到了數據庫中。這樣以來在內存中的session就完全不需要了。這樣做的缺點就是加大了數 據庫的負載,使得數據庫變成了集群的瓶頸。而通過構造數據庫集群提高負載能力往往需要高額的成本。
當然 我們可以用緩存來替代數據庫
4.還可以利用terracotta 實現 tomcat 集群。
不管怎么樣都是解決 session共享的問題
二、不同項目間的session共享
session 共享
第一種 方式:
第 一個 web 生成 一個session 按照 sessionid 存到一個公共的地方。
第二次請求的時候頁面會帶著sessionid的cookie 請求……這個可能可能訪問到了第二個web。第二個web根據請求中帶的sessionid 去 存儲 session的地兒 看看有沒有 這個session 如果有即用取到的session 如果無則新生成一個session
1.使用 tomcat session manager 方法存儲
可以參考 https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
https://github.com/jcoleman/tomcat-redis-session-manager
2.使用 filter 方法存儲
可以參考 https://code.google.com/p/memcached-session-filter/
第二種 方式 :原理 類似……tomcat 集群 ,即將一個tomcat創建一個session后。廣播到其它的tomcat,實現多個tomcat共享一個session實例
不管怎么樣。都需要依賴 sessionid 是否依賴cookie不一定。如果禁用cookie可能會通過url傳參的方式告訴服務sessionid
那么問題來了。
如果 默認依賴 cookie cookies與 域名有關系。且與 contextpath有關系……tomcat sessionid默認存放在 /contextpath 路徑下面。 如果同一個tomcat 部署多個項目?;蛘?多個tomcat部署同一個項目且contextpath不一樣。都將無法通過cookie 取到相同的sessionid
解決辦法:
在 WEB-INF 同級目錄 建 MATE-INF 目錄。新增context.xml
java代碼
<?xml version="1.0" encoding="UTF-8"?> <Context useHttpOnly="true" sessionCookiePath="/" /> 需要共享cookies 獲取 相同 sessionid 的 web 都指定 cookies目錄為 /
如果就可以實現 同 tomcat 不同 項目間的 session共享。解決問題 關鍵。域名相同,cookies存放路徑相同
當然 還可以指定crossContext=true屬性 默認為false
Xml代碼
<?xml version="1.0" encoding="UTF-8"?> <Context useHttpOnly="true" crossContext="true" sessionCookiePath="/" />
如果crossContext=true 則 web 上下文環境是共享的。
如果項目中你用到了 shiro安全框架。你會發現用上面的方式解決不了你的問題,context.xml設置不生效。 失效原因:shiro覆蓋了tomcat的默認cookies方式
配置
Xml代碼
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <PRoperty name="sessionDAO" ref="redisSessionDAO" /> <property name="sessionIdCookie.path" value="/"/> </bean> 當然你也可以定義 cookies模板
以上就是我知道和搜集到的,希望大家指正補充
新聞熱點
疑難解答