2

Я пытаюсь сделать запрос службы SOAP с использованием Spring WebServiceTemplate, однако всегда получаю ошибку.Отправка запроса SOAP с предварительным предварительным аутентификацией

Хотя тот же запрос дает успешный ответ, когда я использую интерфейс SOAP. Единственное, что я делаю по-разному в интерфейсе SOAP, я выбираю радиокнопку «Authenticate Pre-emptively».

Ниже приведены мои фрагменты кода для WebServiceTemplate и клиента.

@Bean(name = "xxxxxWSTemplate") 
public WebServiceTemplate xxxxxWSTemplate() throws Exception { 
    final WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
    webServiceTemplate.setDefaultUri(env.getProperty("integration.webservice.url")); 
    final Jaxb2Marshaller marshaller = new org.springframework.oxm.jaxb.Jaxb2Marshaller(); 
    marshaller.setContextPath(ObjectFactory.class.getPackage().getName()); 
    webServiceTemplate.setMarshaller(marshaller); 
    webServiceTemplate.setUnmarshaller(marshaller); 

    String userName = env.getProperty("integration.service.xxx.username"); 
    String password = env.getProperty("integration.service.xxx.password"); 

    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor(); 
    wss4jSecurityInterceptor.setSecurementUsername(userName); 
    wss4jSecurityInterceptor.setSecurementPassword(password); 
    wss4jSecurityInterceptor.setSecurementMustUnderstand(true); 
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken"); 
    wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText"); 
    wss4jSecurityInterceptor.afterPropertiesSet(); 

    webServiceTemplate.setInterceptors(new ClientInterceptor[] {wss4jSecurityInterceptor}); 

    return webServiceTemplate; 
} 

Я всегда получаю "500-Internal Server Error" из моего кода, однако же выполняется запрос от SOAP-интерфейса.

+0

сообщение stracktrce. Также вы не вызываете 'afterPropertiesSet' на' Jaxb2Marshaller'. Я бы предложил сделать «Jaxb2Marshaller» и перехватчик также весенними управляемыми бобами, поэтому вам не нужно беспокоиться о обратных вызовах жизненного цикла. –

ответ

0

Фактически «Аутентификация Pre-emptively» является частью HTTP-клиента и полностью не связана с SOAP.

Я предполагаю, что ваша проблема находится где-то рядом с «Основной авторизацией».

я предлагаю взглянуть на HttpComponentsMessageSender:

* {@code WebServiceMessageSender} implementation that uses <a href="http://hc.apache.org/httpcomponents-client">Apache 
* HttpClient</a> to execute POST requests. 
* 
* <p>Allows to use a pre-configured HttpClient instance, potentially with authentication, HTTP connection pooling, etc. 
* Authentication can also be set by injecting a {@link Credentials} instance (such as the {@link 
* UsernamePasswordCredentials}). 

также изучить HTTP Authentication от клиента Apache Commons HTTP, например, о своем «упреждающем»:

HttpClient не поддерживает упреждающую аутентификацию из коробки, так как при неправильном использовании или неправильное использования вытесняющей аутентификации может привести к значительным проблемам безопасности, таким как отправка учетных данных в незашифрованном виде в несанкционированной третьей стороной. Поэтому ожидается, что пользователи оценят потенциальные преимущества превентивной аутентификации и рисков безопасности в контексте их конкретной прикладной среды.

Ничего не делать с Spring Integration точки зрения, кстати ...

+0

Я попытался использовать HttpComponentsMessageSender, поскольку вы предложили еще получить «Внутренняя ошибка сервера». Есть ли способ установить пользовательский HTTP-заголовок «Авторизация» через Java + Spring. –

+0

Любой HTTP-заголовок является ответственностью клиента http, а не Spring. Пожалуйста, изучите больше об интернет-клиенте Commons. И было бы здорово узнать, что стоит за этой ошибкой сервера на стороне сервера. –