Java 从url和身份验证使用WSDL实例化JAX-WS服务
像这样实例化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保留为本地副本,并且希望
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();