我的目标是调用Web服务,这需要验证(当我在浏览器中查看它的wsdl时,浏览器会要求我登录+密码)。
作为基础,我使用this教程中的示例。
现在我必须添加身份验证配置。
对documentation进行配置,比如配置WebServiceTemplate bean可能有所帮助。
但是使用Spring Boot,项目中没有applicationContext.xml或任何其他配置xml。
那么,如何使用Spring Boot配置WebServiceTemplate,或者还有什么可以解决这样的任务?
答案 0 :(得分:2)
在Spring Boot中,您可以使用@Bean
注释配置bean。您可以对不同的bean使用配置类。在这些类中,您需要@Configuaration
注释。
这个tutorial描述了Spring教程的“第二部分”。提供教程的主要内容是:(基于Spring教程)
问题
我使用的SOAP Web服务需要基本的http身份验证,所以我 需要在请求中添加身份验证标头。
无身份验证
首先,您需要在没有的情况下实现请求 像spring.io上的教程中的身份验证。接着我会 使用身份验证标头修改http请求。
在自定义WebServiceMessageSender中获取http请求
可以在WeatherConfiguration中访问原始http连接 类。在weatherClient中,您可以设置邮件发件人 WebServiceTemplate。邮件发件人可以访问原始http 连接。所以现在是时候扩展了 HttpUrlConnectionMessageSender并编写它的自定义实现 这会将身份验证标头添加到请求中。我的习惯 发件人如下:
public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender{
@Override
protected void prepareConnection(HttpURLConnection connection)
throws IOException {
BASE64Encoder enc = new sun.misc.BASE64Encoder();
String userpassword = "yourLogin:yourPassword";
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization);
super.prepareConnection(connection);
}
@Bean
public WeatherClient weatherClient(Jaxb2Marshaller marshaller){
WebServiceTemplate template = client.getWebServiceTemplate();
template.setMessageSender(new WebServiceMessageSenderWithAuth());
return client;
}
答案 1 :(得分:0)
另一种解决方法是在handleRequest()
方法中添加一个拦截器并添加requestHeader,从中可以轻松地从HttpUrlConnection
派生TransportContextHolder
;
这是拦截器类的代码:
public class SecurityInterceptor implements ClientInterceptor {
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
TransportContext context = TransportContextHolder.getTransportContext();
HttpUrlConnection connection = (HttpUrlConnection) context.getConnection();
try {
connection.addRequestHeader("Authorization","Basic VVNFUk5BTUU6cGFzc3dvcmQ=");
} catch (IOException e) {
log.error(e.getMessage());
}
return true;
}
//TODO:: other methods and constructor..
}
,当然还要将拦截器添加到WebTemplate:
WebServiceTemplate webServiceTemplate = new WebServiceTemplate(marshaller);
ClientInterceptor[] interceptors = new ClientInterceptor[]{new SecurityInterceptor()};
webServiceTemplate.setInterceptors(interceptors);
webServiceTemplate.marshalSendAndReceive(uriWebService, request)
答案 2 :(得分:0)
我遇到了同样的问题,并通过以下方法解决了。
基本思路是使用基本用户名和密码以及CredentialsProvider
创建AuthScope.ANY
:
@Bean
public WebServiceMessageSender showReqMessageSender(@Value("${ws.username}") String username,
@Value("${ws.passowrd}") String password) throws Exception {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
return new HttpComponentsMessageSender(
HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider)
.addInterceptorFirst(new RemoveSoapHeadersInterceptor()).build());
}
仅需更多信息,便进一步使用此消息发送方bean(通过使用extedning WebServiceGatewaySupport类设置)
void org.springframework.ws.client.core.support.WebServiceGatewaySupport.setMessageSender(WebServiceMessageSender messageSender)