Java 从url和身份验证使用WSDL实例化JAX-WS服务

Java 从url和身份验证使用WSDL实例化JAX-WS服务,java,web-services,jax-ws,Java,Web Services,Jax Ws,像这样实例化JAX-WS服务客户端时: Service s = new Service(new URL("http://www.example.com/ws?wsdl"), new QName("http://www.example.com/ws", "WebService")); 将从该位置检索WSDL 但是,如果该位置需要基本HTTP身份验证,则上面的行将失败,并出现HTTP 401身份验证错误 如果我不希望将WSDL保留为本地副本,并且希望

像这样实例化JAX-WS服务客户端时:

Service s = new Service(new URL("http://www.example.com/ws?wsdl"),
                        new QName("http://www.example.com/ws", "WebService"));
将从该位置检索WSDL

但是,如果该位置需要基本HTTP身份验证,则上面的行将失败,并出现HTTP 401身份验证错误

如果我不希望将WSDL保留为本地副本,并且希望使用上述创建客户端的方法,我需要做哪些更改才能传递所需的凭据?

您可以按如下方式将Web服务和身份验证的复杂性分开:

在运行时下载URL以保证最新版本 将其存储在临时文件中 接下来,使用临时文件初始化服务 下载具有基本身份验证的文件可以通过几种方式实现。下面是一个JSoup示例:

这是ApacheHttpClient的一个例子,它非常流行。其中一个选择是,有几个Base64编码库


这种方法的一个好处是,您可以将下载的文件与以前存储的文件进行比较。这使您能够在进行更改时打印警告。

有一种想法是这样的,不作为答案发布-新URL如何http://username:password@www.example.com/ws?wsdl?您可以尝试在程序的早期调用。唯一的问题是,在某些环境中,如JavaEE中,您可能没有这样做的权限。谢谢,我将尝试这两种建议,并让您知道它是如何进行的
// create authentication header (necessary for some websites)
String base64login = null;
if ((pUsername != null) && (pPassword != null))
{
  String login = pUsername + ":" + pPassword;
  base64login = String.valueOf(com.jidesoft.utils.Base64.encodeBytes(login.getBytes()));
}

//Open a URL Stream
Connection connection = Jsoup.connect(path);
if (base64login != null) connection = connection.header("Authorization", "Basic " + base64login);
if (pRetries != 0) connection.timeout(5000);
Connection.Response resultImageResponse = connection.ignoreContentType(true).execute();

// output here
FileOutputStream out = new FileOutputStream(localFile);
out.write(resultImageResponse.bodyAsBytes());
out.close();