Spring ws &引用;“先发制人”;SpringWS客户端的基本身份验证

Spring ws &引用;“先发制人”;SpringWS客户端的基本身份验证,spring-ws,Spring Ws,我试图使用SpringWS构建一个简单的web服务客户端,但遇到了麻烦。我试图调用的SOAP服务使用HTTP基本身份验证来实现安全性 使用Spring WS教程示例,我已将我的WebServiceTemplate配置为使用HttpComponentMessageSender,并提供凭据: <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> &l

我试图使用SpringWS构建一个简单的web服务客户端,但遇到了麻烦。我试图调用的SOAP服务使用HTTP基本身份验证来实现安全性

使用Spring WS教程示例,我已将我的
WebServiceTemplate
配置为使用
HttpComponentMessageSender
,并提供凭据:

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <constructor-arg ref="messageFactory"/>
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
            <property name="credentials">
                <bean class="org.apache.http.auth.UsernamePasswordCredentials">
                    <constructor-arg value="john:secret"/>
                </bean>
            </property>
        </bean>
    </property>
    <property name="defaultUri" value="http://example.com/WebService"/>
</bean>

当我尝试执行客户机时,出现以下错误:

org.springframework.ws.client.WebServiceTransportException:需要授权[401]

我之前的(和)搜索表明问题在于SpringWS试图在没有凭据的情况下首先连接到端点,这导致端点拒绝初始连接

对于仍然使用HTTP基本身份验证的web服务来说,这似乎是一个非常常见的问题

我的问题是如何让Spring在初始连接尝试时提供凭据

我希望避免为一些看似微不足道的事情重新实现整个框架

(作为参考,端点是一个我无法控制的内部web服务,并且没有其他选项可以使用HTTP基本身份验证,无论人们认为它是多么不存在或不安全)


谢谢

我假设您已经创建了一个扩展WebServiceGatewaySupport的客户端。在这种情况下,在配置类中定义客户机时,将MessageSender设置在那里。MessageSender必须配置凭据

@Bean
public ValidateCustomerClient customerClient(Jaxb2Marshaller marshaller, WebServiceMessageSender messageSender){
    ValidateCustomerClient client = new ValidateCustomerClient();
    client.setDefaultUri(DEFAULT_URI);
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    client.setMessageSender(messageSender);//set MessageSender here instead on WebServiceTemplate
    return client;
}
我发现在WebServiceTemplate上使用凭据设置MessageSender不会在调用客户端时保留凭据,从而导致401


虽然此解决方案对我们的案例有效,但我欢迎任何反馈。

可能的重复我肯定会在WebServiceGatewaySupport的子类上设置发件人,但仍然会得到401。