2012-06-22 115 views
1

我有兩個servlet訪問同一主機上的兩個相應的Axis2 Web服務。其中一個servlet是隻讀的,另一個寫入數據庫。Axis2多連接身份驗證問題

每個Axis2 Web服務都使用BASIC身份驗證。只讀Web服務使用系統帳戶,而寫入Web服務使用用戶憑據(作爲Web表單的一部分提交)。

我遇到的問題是,名爲第二個的servlet始終未通過對其Web服務的身份驗證。例如,我可以通過它的servlet查詢只讀服務,但是當我嘗試使用寫入服務時,我得到了「401:Authorization Required」。如果我首先調用寫入服務,當我嘗試使用只讀服務時,會出現相同的錯誤。

這裏是我如何設置憑據在servlet的連接:

Stub service = new Stub(serviceUrl); 
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator(); 
auth.setUsername(username); 
auth.setPassword(password); 
auth.setPreemptiveAuthentication(true); 

service._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE, auth); 

訪問只讀服務在它的構造此代碼的servlet。訪問寫服務的servlet在其doGet/doPost方法中具有此代碼。

看起來第一個被調用的服務的憑據在某處被緩存,但我找不到可能的位置。我看到了一個可能的解決方案here,但我找不到WSClientConstants.CACHED_HTTP_STATE的定義。 The comments in this JIRA issue似乎暗示它是org.apache.axis2.transport.http.HTTPConstants的一部分,但它不在那裏。

具體細節:

  • 軸版本:1.5.1
  • 的Tomcat版本:6.0.26
  • Java版本:1.6.0_23

回答

1

原來的兩個連接不同的服務使用相同的JSESSIONID。因此,與第二個Web服務的連接嘗試使用爲第一個Web服務驗證的會話,從而導致錯誤。

我對這個解決方案是定義每個服務的HttpClient,通過以下

MultiThreadedHttpConnectionManager manager = new MuliThreadedHttpConnectionManager(); 
HttpClient client = new HttpClient(manager); 

ConfigurationContext context = ConfigurationContextFactory.createDefaultConfigurationContext(); 
context.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, client); 
context.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true); 

Stub service = new Stub(context, serviceUrl); 

做到這允許servlet來爲他們的相應的服務單獨的會話。

0

重要的一點是創建一個專用的ConfigurationContext。

我在一個簡單的方式,而不多線程連接工廠創建存根

存根=新MyStub(ConfigurationContextFactory.createDefaultConfigurationContext(),myServicesUrl)時使用默認配置情況下得到解決;