【问题标题】:JaxWS: Webservice with Basic AuthenticationJaxWS:具有基本身份验证的 Web 服务
【发布时间】:2012-03-30 13:22:08
【问题描述】:

我正在为 SOAP Web 服务构建客户端。我使用 IntelliJ IDEA 自动生成了大部分客户端代码,告诉它从 WSDL 构建 JaxWS Web 服务客户端。

Web 服务在不同的 URL(测试、集成、生产)上运行,因此我需要能够在客户端中配置服务 URL。我的代码如下所示:

String urlString = props.getProperty(URL);
service = new RequestMultiTransportService(new URL(urlString),
              new QName("http://some.uri.com/",
                        "RequestMultiTransportService"));
Boolean useBasicAuth = Boolean.parseBoolean(props.getProperty(BASICAUTH));
RequestMultiTransport rmt = service.getRequestMultiTransportPort();
if (useBasicAuth) {
    String user = props.getProperty(AUTHUSER);
    String pw   = props.getProperty(AUTHPW);
    Map requestContext = ((BindingProvider)rmt).getRequestContext();
    requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
}
ProvisioningResponse response = rmt.send("some", "params", "...");

如您所见,服务可能需要基本身份验证。这就是问题所在:虽然我可以为实际请求配置基本身份验证,但我无法将其配置为加载 WSDL 文件(这发生在 RequestMultiTransportService 的构造函数中)。 RequestMultiTransportService是IDEA自动生成的,它的构造函数只是调用了它的超级构造函数,是javax.xml.ws.Service之一。

因此,无论 web 服务需要基本身份验证,我的代码都会失败,因为它没有提供用于获取位于 urlString 的 WSDL 文件的用户/密码。我想到的一种可能的解决方法是在本地存储 WSDL 文件并使用file:// URL 指向它。但这并不能满足我的要求,因为 WSDL 文件中定义的服务位置各不相同,而且我似乎无法更改从 WSDL 文件加载的service 对象中的服务 URL。

有没有人通过基本身份验证获取 WSDL 文件的解决方案?

【问题讨论】:

  • 好吧,是 JAX-WS 无法做到吗,它看起来像一个错误(我能找到的最相关的是 JAX_WS-1)。由于 JAX-WS 最终将使用 URLConnection,因此可能的解决方法是使用 Authenticator
  • 这可能是可行的,但问题是变通方法会设置一个全局属性,这可能会干扰在同一环境中运行的其他服务。
  • 只需为 JAX-WS 触发一个错误。也许这是你能做的最好的。

标签: web-services soap intellij-idea jax-ws basic-authentication


【解决方案1】:

为您的 WebServiceClient 创建一个新的构造函数,并将用户名、密码和端点位置(不同)作为参数传递给它。在此之后放

requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl);

进入 requestContext 并确保您不会访问 defaultConstructor。

【讨论】:

  • 如何在构造函数中访问requestContext?我不需要打电话给super.getPort()(我想在初始化完成之前不会工作)?如果我不调用超级构造器,那是不是意味着客户端根本不加载 WSDL 文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多