簡體   English   中英

Servlet充當代理:如何轉發會話?

[英]Servlet Acting as Proxy: How to forward the session?

我不太確定我要實現的要求的可行性,但是這是如何進行的:

  • 我創建了一個充當代理的Servlet。 它收到一個RESTful調用,然后在遠程服務器(節點)上調用另一個RESTful服務。
  • 轉發是通過HTTPClient實現的,而不是通過Request Dispatcher實現的。 我基本上是向遠程服務器發出新的HTTP請求。
  • 當第一個服務器(代理服務器)接收到呼叫時,請求( HttpServletRequest )具有與其相關聯的會話。 HTTPSessionisNew()屬性為false。
  • 當呼叫轉移並且遠程服務器接收到呼叫時,會話將成為一個全新的會話。

我試圖從根本上找到一種將會話轉發到遠程服務器的方法。

更精確地說: 是否可以簡單地從HttpServletRequest獲取會話並將其放入新創建的HTTP請求的會話中(通過HTTPClient )?

這取決於您的遠程WS如何維護會話。 例如,如果它使用cookie(Tomcat會在其他技術中做到這一點),則轉發傳入的標頭應該可以幫助您實現這一點(請確保您提到接受cookie,但我默認HTTPClient會這樣做)。 現在,如果它基於URL中的參數,那么您應該嘗試重現該行為。

如果兩個節點(代理節點和服務節點)是不屬於應用程序集群的單獨進程,則可能不是。

Servlet容器通常管理HttpSession。 如果將請求轉發到由另一個容器托管的另一個服務,則將具有另一個會話對象。

如果兩個節點是群集的一部分,那么通常可以通過多種機制(在內存復制,數據庫同步等中)在群集中的節點之間共享會話。

另一個選擇是將會話數據外部化為Redis,Memcached,Coherence等。某些應用程序服務器對此過程具有可插拔的支持。 我相信在這種情況下,應用程序服務器節點不一定必須是集群的成員才能共享會話數據。

當我問這個問題時,我缺乏會話處理的一些基礎知識。 經過一番研究和討論之后,我得到了:

  • 基本上,會話由JSESSIONID變量處理。
  • 當請求到達服務器時,將自動創建JSESSIONID (可以將其關閉)。
  • 它通過響應頭發送回。
  • 遠程服務器認為這是一個新會話的原因是因為請求沒有設置此JSESSIONID

  • 代理執行以下操作以確保轉發會話:

    1. 當傳入請求進入時; 創建並存儲JSESSIONID
    2. 向遠程服務器發出新請求。
    3. 從遠程服務器解壓縮響應頭,然后提取JSESSIONID
    4. 維護客戶端JSESSIONID和遠程服務器JSESSIONID的映射。
    5. 對於以下任何請求,請使用此映射將請求發送到遠程服務器。

基本上,代理會執行從客戶端的JSESSIONID到遠程服務器的JSESSIONID的映射。 這樣,會話將轉發到遠程服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM