2012-06-22 80 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)时使用默认配置情况下得到解决;