web-services - Axis2 多连接认证问题

标签 web-services tomcat servlets apache-axis

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

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

我遇到的问题是名为 second 的 servlet 始终无法通过其 Web 服务的身份验证。例如,我可以通过它的 servlet 查询只读服务,但是当我尝试使用写服务时,我得到了“401:需要授权”。如果我先调用写服务,当我尝试使用只读服务时会遇到同样的错误。

以下是我在 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

最佳答案

事实证明,到两个不同服务的连接使用相同的 JSESSIONID。因此,与第二个 Web 服务的连接试图使用为第一个 Web 服务验证的 session ,从而导致错误。

我的解决方案是为每个服务定义一个 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 为其相应的服务拥有一个单独的 session 。

关于web-services - Axis2 多连接认证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163768/

相关文章:

java - Spring ws - AxiomSoapMessage 和带有 MTOM 的附件是内联的

php - 如何获取有关已发送 PHP curl 请求的信息

android - 带有 JSON 字符串的 HTTP post

java - 后续访问的Tomcat鉴权

tomcat - Apache TOMCAT 上的 Ember-CLI

jsf - JSF 2 项目中 Tomcat 7 启动缓慢

java - 从 java 连接到 DotNet Web 服务的最佳方式是什么?

java - Tomcat 如何处理 keystore 中的多个 SSL 证书?

java - 过滤器映射在 web.xml 中不起作用

java - Servlet 3.0项目打包WAR时修改WebInitParam