0

使用凭证通过 web 服务模板向 messageSender 发出的第一个请求失败,出现 401 未授权,但第二次一切正常且运行良好。

配置:

 <property name="messageSender">
            <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
                <property name="connectionTimeout" value="900000" />
                <property name="readTimeout" value="0" />
                <property name="credentials">
                    <bean class="org.apache.http.auth.UsernamePasswordCredentials">
                        <constructor-arg value="${userName}:${Password}" />
                    </bean>
                </property>

到目前为止,我通过谷歌搜索了解到我必须进行抢先式身份验证以避免使用 [org.apache.http.client.HttpClient] 的 401 未授权。我想要一个 spring xml 配置来允许这样做,以便我可以配置抢先式身份验证。

此外,行为是否符合预期。

到目前为止我所尝试的。

class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
                <property name="connectionTimeout" value="900000" />
                <property name="readTimeout" value="0" />
                <property name="httpClient" ref="httpClient" />
                <property name="credentials" ref="credentials"/>
            </bean>
        </property>



<bean id="httpClient" class="org.apache.http.client.HttpClient">
        <!-- Not Sure what configuration to add here -->
    </bean>

    <bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials">
        <constructor-arg value="${userName}:${password}" />
    </bean>
4

2 回答 2

0

使用凭据提供程序创建 http 客户端,这需要 UsernamePasswordCredentials 和 AuthScope。AuthScope 是使用默认值创建的,而 UsernamePasswordCredentials 是使用用户名、密码创建的。BasicCredentialsProvider 在构造函数或 setter 方法中不采用提供者和凭据。它必须通过调用 setCredentials() 方法来设置。

    <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
        <property name="connectionTimeout" value="900000"/>
        <property name="readTimeout" value="0"/>
        <property name="httpClient" ref="httpClient"/>
    </bean>

    <bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" />

    <bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject"><ref local="credentialProvider" /> </property>
        <property name="targetMethod" value="setCredentials"> </property>
        <property name="arguments"  >
            <list>
                <ref local="authScope" />
                <ref local="credentials" />
            </list>
        </property>
    </bean>    

    <bean id="authScope" class="org.apache.http.auth.AuthScope">
        <constructor-arg name="host"><null /></constructor-arg>
        <constructor-arg><value>-1</value> </constructor-arg>
        <constructor-arg><null /></constructor-arg>
        <constructor-arg><null /></constructor-arg>
    </bean>

    <bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials">
        <constructor-arg name="userName"><value>xxx</value></constructor-arg>
        <constructor-arg name="password"><value>xxx</value></constructor-arg>
    </bean>

    <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
        <property name="credentialsProvider" ref="credentialProvider"/>
    </bean>
于 2017-02-02T12:07:50.837 回答
0

我必须添加到 Webservicetemplate 的配置如下所示:

   <!--  Custom Interceptor Implementation to WebServiceTemplate -->
         <property name="interceptors">
                 <list>
                        <bean class="com.utils.AddHttpHeaderInterceptor" >

                        </bean>
                </list>
            </property>      

并实现实现 ClientInterceptor 的 AddHttpHeaderInterceptor 类,如下所示:

HttpPost postMethod = connection.getHttpPost();
postMethod.addHeader("Authorization", "Basic " + base64Creds);
return true;

注意:base64Creds 只不过是base64.encode(username:pwd)

于 2017-02-09T11:01:28.180 回答