国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

session 共享的幾種方式

2019-11-08 02:11:20
字體:
來源:轉載
供稿:網友

同一個tomcat 多項目 session 共享

我在網上搜了下,主要有以下幾種情況:

集群解決 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模板

以上就是我知道和搜集到的,希望大家指正補充


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 称多县| 本溪| 木里| 信丰县| 绥德县| 乐清市| 大同市| 铁岭市| 潜山县| 南部县| 定安县| 商河县| 古交市| 喀喇沁旗| 武山县| 绥德县| 苗栗市| 荣成市| 陆良县| 曲周县| 深圳市| 友谊县| 天峨县| 尼勒克县| 汝州市| 秭归县| 泌阳县| 汝阳县| 娱乐| 卓资县| 行唐县| 兴文县| 二连浩特市| 原平市| 贡嘎县| 大兴区| 育儿| 九龙坡区| 安西县| 小金县| 济阳县|