使用凭证通过webservicetemplate向messageSender发出的第一个请求失败,401未经授权,但第二次一切正常并且运行良好。
配置:
{{1}}
从目前为止,通过Google搜索我知道我必须进行抢先身份验证,以避免使用[org.apache.http.client.HttpClient]进行未经授权的401。我想要一个spring xml配置允许这样我就可以配置抢占式身份验证。
此外,行为是预期的。
到目前为止我的尝试。
{{1}}
答案 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)