使用[org.apache.http.client] HttpClient 4.1.1首次获取401

时间:2017-02-02 11:18:11

标签: java spring authentication httpclient webservicetemplate

使用凭证通过webservicetemplate向messageSender发出的第一个请求失败,401未经授权,但第二次一切正常并且运行良好。

配置:

{{1}}

从目前为止,通过Google搜索我知道我必须进行抢先身份验证,以避免使用[org.apache.http.client.HttpClient]进行未经授权的401。我想要一个spring xml配置允许这样我就可以配置抢占式身份验证。

此外,行为是预期的。

到目前为止我的尝试。

            

{{1}}

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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)