freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于zookeeper的分布式session實(shí)現(xiàn)-已發(fā)布-文庫(kù)吧資料

2025-06-24 17:06本頁(yè)面
  

【正文】 。//獲取session IDObject getAttribute(String name) {接下來(lái)我們看看Session對(duì)象的幾個(gè)重要方法的重寫(xiě):public}以上代碼會(huì)實(shí)例化一個(gè)Session對(duì)象,并將Session ID寫(xiě)入客戶端Cookie中,最后實(shí)例化Session元數(shù)據(jù),并在ZooKeeper上新建一個(gè)Session節(jié)點(diǎn)。return(id)。new])。+ () +(cookie !=.getResponse())。Cookie cookie = (id, req, ()寫(xiě)cookieString id = ()。(AbstractSessionManager) (), request)。JettyDistributedSession(Session session =null。(不是Jetty容器下的Request對(duì)象)。Request)) {(!(requestpublic如果通過(guò)上面的方法返回的Session對(duì)象還是null,則真的需要實(shí)例化一個(gè)Session對(duì)象了,代碼如下所示:正如代碼中所展示的,我們實(shí)例化一個(gè)指定ID的Session對(duì)象,并放入當(dāng)前系統(tǒng)的Session容器中,這樣就完成了Session ID在分布式環(huán)境中的共享,以及Session對(duì)象在各子系統(tǒng)之間的同步。唯一有價(jià)值的就Session ID,因此,我喜歡把本地Session容器中的Session對(duì)象稱為“影子”Session,它只是ZooKeeper上真正Session的一個(gè)影子而已。然后先到本地的Session容器中查找是否存在該ID的Session對(duì)象。}首先根據(jù)ID去ZooKeeper上驗(yàn)證此Session是否有效,如果無(wú)效了,則直接返回null,表示此Session已經(jīng)超時(shí)不可用,同時(shí)需要?jiǎng)h除本地的“影子”Session對(duì)象(不管存在與否)。}return(), id)。JettyDistributedSession((AbstractSessionManager) (),session =//否則創(chuàng)建指定ID的Session并返回(用于同步分布式環(huán)境中的其他機(jī)器上的Session本地副本)}returnnull) {if//如果存在,則直接返回HttpSession session =elsenull。(id)。//刪除本地的副本(!valid) {valid = (id)。Request req = (Request) request。//將HttpServletRequest轉(zhuǎn)換成Jetty容器的Request類(lèi)型}returninstanceofif//類(lèi)型檢查HttpSession getHttpSession(String id, HttpServletRequest request) {所以先要對(duì)已經(jīng)存在的Session ID進(jìn)行處理。B)}這個(gè)方法就是從客戶端的Cookies中查找我們的一個(gè)自定義的Cookie值,這個(gè)Cookie的名稱為:”DISTRIBUTED_SESSION_ID”(Web容器自己也在Cookie中寫(xiě)了一個(gè)值,用來(lái)在不同的request中傳遞Session ID,這個(gè)Cookie的名稱叫“JSESSIONID”)。returngetRequestSessionId(HttpServletRequest request) {public獲取Session ID:Override因此,還是讓我們來(lái)關(guān)注sessionManager的相關(guān)方法實(shí)現(xiàn)。}return}=amp。nullsessionManageramp。null(sessionnull。amp。null(sessionrequest)。=!=amp。(id !=])。(獲取客戶端的Session ID:[String id =//從客戶端cookie中查找Session IDnull。sessionsession。!=amp。!=if}newamp。null(sessionManagerHttpSession getSession(boolean接下來(lái)我們來(lái)看看,Request包裝器是如何重寫(xiě)getSession方法,替換成使用ZooKeeper上的Session數(shù)據(jù)。另外我們還自己實(shí)現(xiàn)sessionManager接口,用來(lái)管理Session的生命周期。}}這里實(shí)例化了一個(gè)包裝器(裝飾者模式)類(lèi),用來(lái)包裝Jetty容器的Request對(duì)象,并覆蓋其getSession方法。sessionManager)。new//ServletException {throwsvoid}在filter中需要關(guān)注的重點(diǎn)是doFilter方法。()。//銷(xiāo)毀ZooKeeper}}catch()。{!=ifdestroy() {publicOverride*/see銷(xiāo)毀/**(conf)。//初始化ZooKeeper配置參數(shù)}}+ poolsize +catch((poolsize))。{if].)。(timeout parse error[(NumberFormatException ex) {}try((timeout)) {String timeout = (TIMEOUT)。}ifConfiguration()。=throwsvoidinit()**=Stringstatictimeout。Stringstaticservers。StringstaticsessionManager。protected/**Session管理器*/protected/**參數(shù)配置*/Loggerimplementsclass}}這個(gè)filter是繼承自DistributedSessionFilter的,這個(gè)父類(lèi)主要是負(fù)責(zé)完成初始化參數(shù)設(shè)置等通用方法的實(shí)現(xiàn),代碼如下所示:publicsessionManager)。new//ServletException {throwsvoid}}catch( pleted.)。//()。{JettyDistributedSessionManager(conf)。=//throwsvoidlogprivateDistributedSessionFilter {JettyDistributedSessionFilterpublic實(shí)現(xiàn)過(guò)程實(shí)現(xiàn)分布式Session的第一步就是要定義一個(gè)filter,用來(lái)攔截HttpServletRequest對(duì)象。這個(gè)問(wèn)題在memcached和ZooKeeper上都存在的。version屬性:這個(gè)屬性是為了冗余Znode的version值,用來(lái)實(shí)現(xiàn)樂(lè)觀鎖,對(duì)Session節(jié)點(diǎn)的元數(shù)據(jù)進(jìn)行更新操作。validate屬性:表示當(dāng)前Session是否可用,如果超時(shí),則此屬性為false。currentTimeMillis(),就表示當(dāng)前Session超時(shí)。用來(lái)計(jì)算當(dāng)前Session是否超時(shí)。c)b)其中需要關(guān)注的屬性有:a)}=== ()。public*/*intfalse。validateprivate/**是否可用*/private/**session的最后一次訪問(wèn)時(shí)間*/private/**session的最大空閑時(shí)間*/private/**session的創(chuàng)建時(shí)間*/privateserialVersionUIDfinalprivateSerializable {SessionMetaData以下代碼就是SessionMetaData的實(shí)現(xiàn):public最后我們來(lái)關(guān)注一下Session節(jié)點(diǎn)中的數(shù)據(jù)——SessionMetaData。如果Session中的Map大于1MB,就不能單節(jié)點(diǎn)的存儲(chǔ)了。同理,在寫(xiě)Session的時(shí)候,也可以最大限度的減少數(shù)據(jù)流量。但是大部分情況下,我們?cè)谧x取數(shù)據(jù)時(shí)并不需要整個(gè)Map,而是Map中的一個(gè)或幾個(gè)值。采用這種設(shè)計(jì)主要是考慮到性能問(wèn)題和ZooKeeper對(duì)節(jié)點(diǎn)大小的限制問(wèn)題。因此,每個(gè)節(jié)點(diǎn)天然就是一個(gè)KeyValue鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。在這個(gè)目錄下可以存放0個(gè)或N個(gè)子節(jié)點(diǎn),我們就把一個(gè)Session的實(shí)例作為一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)的名稱就是Session ID?!?SESSIONS”是一個(gè)組節(jié)點(diǎn),用來(lái)在ZooKeeper上劃分不同功能組的定義。2)我們還是通過(guò)客戶端的Cookie來(lái)實(shí)現(xiàn),我們會(huì)自定義一個(gè)Cookie,并通過(guò)一定的算法在多個(gè)子系統(tǒng)之間進(jìn)行共享。也就是說(shuō),ZooKeeper負(fù)責(zé)Session數(shù)據(jù)的存儲(chǔ),而我們自己實(shí)現(xiàn)的Session管理器將負(fù)責(zé)Session生命周期的管理。Web容器中的Session容器也將發(fā)生變化。通過(guò)選舉算法,最終由一臺(tái)原本是跟隨者的 服務(wù)器升級(jí)為領(lǐng)導(dǎo)者。所有的讀操作由跟隨者提供,而寫(xiě)操作由領(lǐng)導(dǎo)者提供,并且領(lǐng)導(dǎo)者還負(fù)責(zé)將寫(xiě)入的數(shù)據(jù) 復(fù)制到集群中其他的跟隨者。1)但是它為我們提供了一套工具集合,幫助我們建立安全處理局部故障的分布式應(yīng)用程序。由于數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)傳輸,而網(wǎng)絡(luò)是不穩(wěn)定的,所以如果網(wǎng)絡(luò)發(fā)生故障,則所有的數(shù)據(jù)通訊都將終止。5.由此可見(jiàn),實(shí)現(xiàn)分布式Session其實(shí)是和某種Web容器緊密耦合的。因?yàn)樵贘etty的HttpServletRequest實(shí)現(xiàn)類(lèi)的一些方法中對(duì)Session的類(lèi)型進(jìn)行了強(qiáng)制轉(zhuǎn)換(轉(zhuǎn)換成它自定義的HttpSession實(shí)現(xiàn)類(lèi)),如果不從其繼承,則會(huì)出現(xiàn)ClassCastException異常。有人會(huì)說(shuō),那就放棄它的實(shí)現(xiàn)吧,我們自己實(shí)現(xiàn)HttpSession接口。例如,在Jetty容器中,HttpSession的實(shí)現(xiàn)類(lèi)是一個(gè)保護(hù)內(nèi)部類(lèi),無(wú)法從其繼承并覆蓋相關(guān)的方法,只能從其實(shí)現(xiàn)類(lèi)的父類(lèi)中繼承更加抽象的Sess
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1