Axis2多连接身份验证问题

时间:2012-06-22 20:38:13

标签: web-services tomcat servlets axis2

我有两个servlet可以访问同一主机上的两个相应的Axis2 Web服务。其中一个servlet是只读的,而另一个是写入数据库的。

每个Axis2 Web服务都使用BASIC身份验证。只读Web服务使用系统帐户,而写入Web服务使用用户的凭据(作为Web表单的一部分提交)。

我遇到的问题是名为 second 的servlet总是对其Web服务的身份验证失败。例如,我可以通过它的servlet查询只读服务,但是当我尝试使用write服务时,我得到了“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在其构造函数中包含此代码。访问write服务的servlet在其doGet / doPost方法中包含此代码。

似乎第一个被调用服务的凭据正在某处缓存,但我无法找到它的位置。我看到了一个可能的解决方案here,但我找不到定义WSClientConstants.CACHED_HTTP_STATE的位置。 The comments in this JIRA issue似乎暗示它是org.apache.axis2.transport.http.HTTPConstants的一部分,但它并不存在。

具体细节:

  • Axis版本:1.5.1
  • Tomcat版本:6.0.26
  • Java版本:1.6.0_23

2 个答案:

答案 0 :(得分: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为其相应的服务建立单独的会话。

答案 1 :(得分:0)

重要的是创建一个专用的ConfigurationContext。

在创建没有多线程连接工厂的存根时,我使用默认配置上下文以更简单的方式解决了

stub = new MyStub(ConfigurationContextFactory.createDefaultConfigurationContext(),myServicesUrl);