跨web容器的會話共享方法、系統及web應用服務器的制造方法
【技術領域】
[0001] 本發明屬于互聯網技術領域,尤其設及一種跨web容器的會話共享方法、系統及 web應用服務器。
【背景技術】
[0002] 互聯網應用的用戶數和訪問量是動態變化的過程,在平臺建設時很難估算對服務 器的需求,在某些特殊的時點用戶數和訪問量甚至呈現爆發性的增長。針對運樣的場景,目 前業界通用的做法是從系統的架構入手,采用可伸縮(可擴展)的設計。可伸縮帶來高性 能,同時由能享受低成本和可維護性,可伸縮性講究平滑線性的性能提升,側重于系統的水 平伸縮,通過廉價的服務器實現分布式計算。
[0003] 由于HTTP是無狀態的協議,互聯網應用是通過SESSI0NID在瀏覽器和服務器之間 保持會話,運種情況下同一個用戶的請求只能由一臺固定的服務器來處理,因為在其他的 服務器上沒有其會話信息。基于可伸縮的分布式架構下,用戶的每一次請求幾乎都是不同 的服務器在處理,運樣才能發揮分布式的最大優勢,讓負載在多臺服務器中達到均衡。
[0004] 針對上面的問題,現有兩種解決方案。第一種是通過硬件/軟件路由器將來自同 一個用戶的請求始終路由到同一臺服務器去處理。運個方案可能會導致個別服務器過載, 而其它服務器卻空閑;第二種是在服務器端不保存會話數據,將會話數據保存在瀏覽器的 COOKIE里,每次請求時將COOKIE里的會話數據作為業務請求數據發送給服務器。運個方案 由于會話數據保存在瀏覽器本地COOKIE里,存在安全隱患,同時COOKIE也有大小限制,每 次請求都會附加發送會話數據,增加了通訊的開銷。
【發明內容】
陽0化]有鑒于此,本發明實施例提供一種跨web容器的會話共享方法、系統及web應用服 務器,W解決現有技術在處理用戶請求時,存在導致個別web服務器過載或者存在安全隱 患、增加通訊開銷的問題。
[0006] 第一方面,提供一種跨web容器的會話共享方法,所述方法包括:
[0007] 攔截網關發送的用戶請求,所述用戶請求是同一用戶的請求;
[0008] 將與所述用戶請求對應的會話數據寫入至內存數據庫中或者從內存數據庫中讀 取與所述用戶請求對應的會話數據。
[0009] 進一步地,所述內存數據庫包括一個主內存數據庫和多個從內存數據庫,每個web 應用服務器與一個從內存數據庫連接,所有的web應用服務器均與主內存數據庫連接。
[0010] 進一步地,所述將與所述用戶請求對應的會話數據寫入至內存數據庫中,包括:
[0011] 將與所述用戶請求對應的會話數據寫入主內存數據庫中。
[0012] 進一步地,在所述將與所述用戶請求對應的會話數據寫入主內存數據庫中之后, 所述方法還包括:
[0013] 將主內存數據庫中的會話數據同步至從內存數據庫中;
[0014] 所述從內存數據庫中讀取與所述用戶請求對應的會話數據,包括:
[0015] 從從內存數據庫中讀取與所述用戶請求對應的會話數據。
[0016] 第二方面,提供一種web應用服務器,所述web應用服務器包括:
[0017] 過濾器單元,用于攔截網關發送的用戶請求,所述用戶請求是同一用戶的請求;
[0018] 會話處理單元,用于將與所述用戶請求對應的會話數據寫入至內存數據庫中或者 從內存數據庫中讀取與所述用戶請求對應的會話數據。
[0019] 進一步地,所述內存數據庫包括一個主內存數據庫和多個從內存數據庫,每個web 應用服務器與一個從內存數據庫連接,所有的web應用服務器均與主內存數據庫連接。
[0020] 進一步地,所述會話處理單元將與所述用戶請求對應的會話數據寫入主內存數據 庫中。
[0021] 進一步地,所述web應用服務器還包括:
[0022] 數據同步單元,用于將主內存數據庫中的會話數據同步至從內存數據庫中;
[0023] 所述會話處理單元從從內存數據庫中讀取與所述用戶請求對應的會話數據。
[0024] 第=方面,提供一種跨web容器的會話共享系統,所述系統包括瀏覽器,網關,所 述系統還包括多個第二方面所述的web應用服務器、與所有的web應用服務器均保持連接 的一個主內存數據庫W及與多個web應用服務器連接的多個從內存數據庫。
[0025] 在本發明實施例,攔截到用戶請求后,將與所述用戶請求對應的會話數據寫入至 內存數據庫中或者從內存數據庫中讀取與所述用戶請求對應的會話數據,從而實現了web 容器之間會話數據的共享。
【附圖說明】
[00%] 圖1是本發明跨web容器的會話共享方法實施例的實現流程圖;
[0027] 圖2是本發明web應用服務器的結構框圖;
[0028] 圖3是本發明跨web容器的會話共享系統實施例的結構框圖。
【具體實施方式】
[0029] 為了使本發明的目的、技術方案及優點更加清楚明白,W下結合附圖及實施例,對 本發明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用W解釋本發明,并 不用于限定本發明。
[0030] 在本發明實施例中,web應用服務器攔截到用戶請求后,將與所述用戶請求對應的 會話數據寫入至內存數據庫中或者從內存數據庫中讀取與所述用戶請求對應的會話數據。
[0031] W下結合具體實施例對本發明的實現進行詳細描述: W巧實施例一
[0033] 圖1示出了本發明實施例一提供的跨web容器的會話共享方法的實現流程,詳述 如下:
[0034] 在步驟SlOl中,攔截網關發送的用戶請求,所述用戶請求是同一用戶的請求。
[0035] 在本發明實施例中,瀏覽器接收到用戶請求后,將所述用戶請求發送至網關,由網 關根據負載均衡算法將接收到的用戶請求發送至相應的web應用服務器。
[0036] 其中,所述用戶請求是指同一用戶的請求,所述web應用服務器可W是TOMCAT服 務器,也可W是Apache服務器,具體采用哪種類型的web應用服務器,本實施例中不做限 制。
[0037] 在步驟S102中,將與所述用戶請求對應的會話數據寫入至內存數據庫中或者從 內存數據庫中讀取與所述用戶請求對應的會話數據。
[0038] 在本發明實施例中,web應用服務器攔截到網關發送的用戶請求后,將與所述用戶 請求對應的會話數據寫入至內存數據庫中或者從內存數據庫中讀取與所述用戶請求對應 的會話數據。
[0039] 在會話過程中,web應用服務器中的web容器負責為客戶端維護一個唯一的 HttpSession對象,不同的用戶對應一個唯一的HttpSession對象。對于新會話,web容器 創建使用實現了化tpSession接口的化化Session對象封裝當前用戶請求的會話數據。
[0040] 具體的,可W在web應用服務器的web容器配置文件中配置JAVA過濾器,通過所 述JAVA過濾器攔截網關發送的用戶請求,攔截到網關發送的用戶請求后,再調用自定義的 化tpServletRequest實例,從而由化1:pSe;rvletRequest實例中的成員變量化1:pSession對 象接管原web容器對所有用戶請求的處理,將用戶請求的會話數據寫入至內存數據庫中。
[0041] 其中,化tpSession對象可W將與用戶請求對應的會話數據寫入至內存數據庫中, 也可W從內存數據庫中讀取與用戶請求對應的會話數據。
[0042] 具體的,將W下配置片段放入web容器的web.xml文件中,web應用服務器即可調 用JAVA過濾器攔截網關發送的用戶請求:
[0044] 其中,〈filter-class〉中的com.websuites.web.filter.Reques地eaderFilter 是要調用的JAVA過濾器的類。
[0045] 另外,將W下jar文件也放在工程目錄下,web應用服務器運行時會自動讀取運些 jar文件。
[0046] 其中,所述內存數據庫可W是hstOB、Memcached和Redis,具體采用哪種內存數 據庫,本實施例中不做限制。
[0047] 優選地,為了有效避免內存數據庫的單點故障,內存數據庫節點采用一主多從結 構,包括一個主內存數據庫和多個從內存數據庫,每個web應用服務器與一個從內存數據 庫連接,也就是說一個web應用服務器唯一對應一個從內存數據庫,所有的web應用服務器 均與主內存數據庫連接。
[0048] 優選地,web應用服務器是將與用戶請求對應的會話數據寫入至主內存數據庫中, 然后,將主內存數據庫中的會話數據同步至從內存數據庫中,后續,攔截到用戶請求后,web 應用服務器可W從與其連接的從內存數據庫中讀取與所述用戶請求對應的會話數據。
[0049] 本實施例,web應用服務器攔截到用戶請求后,將與所述用戶請求對應的會話數據 寫入至內存數據庫中或者從內存數據庫中讀取與所述用戶請求對應的會話數據,從而實現 了web容器之間會話數據的共享,相比現有技術安全、高效、簡潔。克服了現有技術在處理 用戶請求時,存在