java-具有可配置凭据的Spring WebServiceClient
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-具有可配置凭据的Spring WebServiceClient,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3158字,纯文字阅读大概需要5分钟。
内容图文
![java-具有可配置凭据的Spring WebServiceClient](/upload/InfoBanner/zyjiaocheng/665/fc947d5cca194c7bb9e508eb7552bee0.jpg)
我想在Spring中使用可配置的凭据创建一个SOAP Web服务客户端.
相同的实现将用于通过不同的用户/通过身份验证来呼叫不同的客户.
将使用基本身份验证.
类似于spring ws WebServiceTemplate credentials,但每个呼叫具有不同的凭据.
有没有比每次获取WebServiceMessageSender并设置凭据更好的方法了?
如果这样做,与其他客户并行执行的请求会怎样?
当前配置
@Bean
public WebServiceTemplate webServiceTemplate(){
WebServiceTemplate template = new WebServiceTemplate();
template.setMessageSender(messageSender());
return template;
}
@Bean
public HttpComponentsMessageSender messageSender(){
HttpComponentsMessageSender sender = new HttpComponentsMessageSender();
return sender;
}
Web服务客户端
public Status updateStatus(URL url, String user, String password,PackageStatus request){
WebServiceTemplate template = getWebServiceTemplate();
//TODO set credentials here ???
return (Status) template.marshalSendAndReceive(request);
}
非常感谢您的帮助,
新
解决方法:
最通用的解决方案是创建一个常规Java工厂类,该类将在给定凭据的情况下创建Web服务模板.以下是使用apache HttpComponents版本4.3的示例:
class WebServiceTemplateFactory {
//@Autowired - all dependencies that don't change, such as WebServiceMessageFactory, Marshaller etc.
WebServiceTemplate createWebServiceTemplate(String user, String pwd) throws Exception {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
//create the HTTP client
RequestConfig requestConfig = RequestConfig.custom().setStaleConnectionCheckEnabled(true).build(); //can set more stuff like connection timeout etc.
SSLContext sslContext = SSLContexts.custom().build();
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, null, null, SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, pwd));
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setSSLSocketFactory(sslSocketFactory)
.setDefaultCredentialsProvider(credentialsProvider)
.addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor()) //preventing 'org.apache.http.ProtocolException: Content-Length header already present' exception
.build();
//create the message sender
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(httpClient);
messageSender.afterPropertiesSet(); // just for consistency - not expecting much from this call
webServiceTemplate.setMessageSender(messageSender);
//... set the rest of dependencies, if needed
return webServiceTemplate;
}
}
这是我所看到的最基本的解决方案.
您可以通过不为相同的用户名创建单独的客户端来优化它.您可能还为所有这些客户端拥有一个客户端-查看Apache HttpComponents文档(或您使用的其他基础客户端的文档).
请注意,Spring-WS本身并不实现客户端,它只是对某些现有HTTP客户端的包装.
更新:
如果您使用的是Apache HttpClient,请检查其对AuthScope的使用.您可以为所有目的地(主机,端口)创建一个HttpClient,每个目的地都有自己的用户名/密码对.但是您必须事先了解它们.如果是这种情况,那么可以使用上面的代码(修改为设置所有AuthScope /凭证对)来创建常规的Spring bean.正确的用户名/密码对将由Apache HttpClient根据目的地自动选择.
内容总结
以上是互联网集市为您收集整理的java-具有可配置凭据的Spring WebServiceClient全部内容,希望文章能够帮你解决java-具有可配置凭据的Spring WebServiceClient所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。