2010-08-13 43 views
0

我其中有一個Servlet技術的一個了HTTPClient在它配置 - 宣佈GetMethod它調用Servlet的B(基本合格的URL的Servlet B的構造函數」Servlet會話了HTTPClient

在Servlet的BI正在設置一些會話。 VAR和當在Servlet甲回來進行控制的「執行」的方法之後,但是在會話中乏的Servlet乙設定正在返回空。

的Servlet甲

doPost(req,res) 
     { 
     HTTPClient client = new HTTPClient(); 
     GetMethod get = new GetMethod("/ServletB.do"); 
     client.execute(get); 

     System.out.println("Value of a is :: " + session.getAttribute("a")) ; //gives a NULL 
} 

的Servlet乙

doPost(req,res) 
{ 
HTTPSession session = req.getSession(); 
session.setAttibute("a",a); 
session.setAttibute("b",b); 

} 

您能否讓我知道我的選擇在這裏解決這個問題?

回答

0

我可以看到你調用執行從一個「讓」,而你在B中給出的處理代碼「後」您正在使用使用session.getAttribute("a"))檢索參數

而且會比「會話」不同由B servlet看到。

2

您至少有兩個問題與您的代碼:

  • 您需要通過從Servlet中生成會話ID的HTTP請求的servlet B.如何會話ID在客戶端和服務器之間傳遞是特定於容器的,但通常會話ID是作爲HTTP cookie傳遞的。

  • 如果多個servlet同時訪問同一個會話並且其中一個servlet正在添加或替換新屬性,那麼servlet規範並不保證會話屬性中的更改對所有servlet立即可見。

你最好的選擇可能是在servlet的B中的業務邏輯轉移到一個單獨的類和使用該類來自servlet的一個或servlet B.或者你有其他一些奇怪的原因作出的HTTP調用一個servlet到同一個web應用程序中的不同servlet,而不是簡單地進行方法調用?

0

正確的解決方案取決於這些servlet實際運行的位置。

  • 如果這些小服務器在同一Web服務器ServletContext的運行,那麼就使用RequestDispatcher#include()。他們將有權訪問完全相同的會話。

    request.getRequestDispatcher("/anotherservlet").include(request, response); 
    
  • 如果這些小服務器在同一Web服務器運行,但不同 ServletContext中,然後再考慮共享會話,讓他們將共享完全相同的會話。目前還不清楚你使用的是什麼servletcontainer,所以這裏只是一個以Tomcat爲目標的例子,給你一些提示。就在雙方的webapp contexs的crosscontext屬性設置爲true

    <Context crossContext="true"> 
    
  • 如果這些小服務器在不同網絡服務器上運行,那麼你需要傳遞感興趣的數據作爲請求參數。這是你最好的選擇,真的。他們不會也不能共享同一個會話,這將是一個安全漏洞。

    new GetMethod("http://example.com/ServletB.do?name1=value1&name2=value2"); 
    

    如果數據比較大,那麼考慮一個共享數據庫,這樣你只需要傳遞PK值作爲請求參數。