gpt4 book ai didi

java - 使用来自 Java 的摘要身份验证的 WCF 服务

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:11 25 4
gpt4 key购买 nike

我想用 Java 创建一个连接到需要摘要式身份验证的 Web 服务的客户端。由于我不熟悉 java 和 java 堆栈,我进行了研究并遇到了 jax-ws、axis2、xcf 和 metro。我了解到 JAX-WS 是一个 API,在 JDK 中有一个引用实现,但它缺少摘要授权支持。

我的第一次尝试是使用 axis2,因为 Eclipse IDE 内置了对它的支持。下面的代码似乎遵循了摘要认证的工作流程,但不知何故,它最终还是授权失败。

Service1Stub stub = new Service1Stub();

HttpTransportProperties.Authenticator authenticator = new Authenticator();
List<String> authSchemes = new ArrayList<String>();
authSchemes.add(Authenticator.DIGEST);
authenticator.setAuthSchemes(authSchemes);
authenticator.setUsername("doman user");
authenticator.setPassword("domain password");
authenticator.setPreemptiveAuthentication(true);
Options options = stub._getServiceClient().getOptions();
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, authenticator);
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, org.apache.axis2.Constants.VALUE_FALSE);

GetData getData = new GetData();
getData.setValue(25);
GetDataResponse data = stub.getData(getData);
System.out.println(data.getGetDataResult());

我的第二次尝试是使用 Metro 框架,但我遇到了一些与 JAXB 版本相关的错误。

java.lang.LinkageError: JAXB 2.1 API is being loaded from the bootstrap classloader, 但这个 RI 需要 2.2 API。

我必须使用 JDK 1.6.0_03,所以我猜这是由于 JDK 版本不匹配而发生的,但我也不想使用建议的“认可目录机制”,因为它可能会在部署期间造成很多麻烦。

我完全迷路了,我正在寻找最简单、最快速和最新的方式来使用需要在 Java 中进行摘要式身份验证的 Web 服务?最好尽可能少的依赖。

最佳答案

Java 类加载一团糟,抱歉。根本原因是没有像 .NET 世界中那样的强名称,因此运行时链接器会采用类路径中最先出现的任何匹配项,而不管它是否是编译代码所针对的库版本。 OSGi 系统解决了这个问题,但它从未获得主流采用。

您引用的错误信息:

java.lang.LinkageError: JAXB 2.1 API is being loaded from the bootstrap classloader, but this RI needs 2.2 API.

非常有用和具体,大多数情况下,您只会盯着 NoSuchMethodError 看或类似的东西。随着时间的推移,您会学会将这些识别为库版本不匹配。在这种情况下,库作者编写了代码来识别常见的错误情况并打印更好的错误消息(保佑他们)。

咆哮结束,这里有一些信息,我希望能帮助你走上正轨:

  • Java 类加载器是分层的,解析是自下而上的
  • 但是在层次结构的根部有一个受祝福的类加载器,负责加载核心运行时库
  • 供应商的恶作剧导致很多东西被包含在核心运行时库中,而这些东西实际上不应该包含在其中,因为它是在原本 Darwin 主义的选择过程中占据主导地位的捷径。正如您刚刚发现的那样,JAXB 就是其中之一。 JAXB2 实际上相当不错,但它的发展独立于核心运行时,好吧,我们到了。
  • JDK 和 JRE 安装有一个名为 lib\endorsed 的文件夹您可以在其中添加需要由根加载程序加载的 JAR 文件,甚至绕过 rt.jar 中的内容.

综上所述,如果手动添加JAXB库的2.2版本到%JAVA_HOME%\lib\endorsed ,那么它应该覆盖包含的 2.1 版本,并且您的 Web 服务客户端将部署。在将 JDK 更新到包含 JAXB 2.2 的 7.x 版本之前,这将必须在将运行 Web 服务客户端的每个系统上发生。如果同一 JVM 正在运行其他基于 JAXB 的应用程序,这些应用程序可能会或可能不会因此中断。

是的,这很痛苦。您可以调查的一个切线是故意使用为 JAXB 2.1 构建的旧版本的 Metro。只要您一定要在 1.6.0_03 上部署,这很可能是更好的选择,尽管失去了 Metro 最近的一些改进。

更新:这是一个blog post关于这个话题。它包含一些指向更多信息的链接。

关于java - 使用来自 Java 的摘要身份验证的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14896324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com