使用 Spring 的 Apache CXF 异步管道和 NTLM?
Apache CXF Async Conduit and NTLM using Spring?
我正在尝试找出将以下代码移至 spring .xml 配置文件的最佳方法:(强制异步并禁用 chunkng 以便 NTLM 工作)
final WSSoap port = new WS().getWSSoap();
final Client client = ClientProxy.getClient(port);
final HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
final HTTPClientPolicy httpClientPolicy = httpConduit.getClient();
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
final BindingProvider bindingProvider = (BindingProvider) port;
final Map<String, Object> requestContext = bindingProvider.getRequestContext();
final Credentials credentials = new NTCredentials("username", "password", "workstation", "domain");
requestContext.put(Credentials.class.getName(), credentials);
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://www.example.com/");
requestContext.put(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);
我已经查看了 CXF 配置页面(此处:http://cxf.apache.org/docs/configuration.html),但我看不到任何方法可以满足我的需要。
有没有一种干净的方法可以使用 spring 处理 CXF 的 NTLM 身份验证?
更新: 我已经想出如何使用以下方法强制异步管道:
<cxf:bus name="asyncBus">
<cxf:properties>
<entry key="use.async.http.conduit" value="true"/>
</cxf:properties>
</cxf:bus>
<http-conf:conduit name="{http://www.webserviceX.NET}GlobalWeatherSoapPort.http-conduit">
<http-conf:client AllowChunking="false" Connection="Keep-Alive"/>
</http-conf:conduit>
<jaxws:client id="weatherClient" bus="asyncBus"
address="http://www.webservicex.com/globalweather.asmx"
serviceClass="net.webservicex.GlobalWeatherSoap"/>
但是我仍然无法访问请求上下文,因此我可以添加我的 NTLM 凭据。
我想回答我自己的问题。经过许多小时调试和单步执行 Apache CXF 代码后,我找到了解决方案。以下 spring 配置将通过异步管道启用 NTLM 身份验证:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd">
<!--
~
~ create an asynchronous-only bus for NTLM requests
~
-->
<cxf:bus name="asyncBus">
<cxf:properties>
<entry key="use.async.http.conduit" value="true"/>
</cxf:properties>
</cxf:bus>
<!--
~
~ configure conduit for NTLM request
~
-->
<http-conf:conduit name="{http://www.webserviceX.NET}GlobalWeatherSoapPort.http-conduit">
<http-conf:client AllowChunking="false" AutoRedirect="true" Connection="Keep-Alive"/>
</http-conf:conduit>
<!--
~
~ create service stub
~
-->
<jaxws:client id="weatherClient" bus="asyncBus"
address="http://www.webservicex.com/globalweather.asmx"
serviceClass="net.webservicex.GlobalWeatherSoap">
<jaxws:properties>
<entry key="org.apache.http.auth.Credentials">
<bean class="org.apache.http.auth.NTCredentials">
<constructor-arg value="DOMAIN/USER:PASSWORD"/>
</bean>
</entry>
</jaxws:properties>
</jaxws:client>
</beans>
如有必要,也可以在 NTCredentials
构造函数中指定用户名、密码、域和工作站。
我正在尝试找出将以下代码移至 spring .xml 配置文件的最佳方法:(强制异步并禁用 chunkng 以便 NTLM 工作)
final WSSoap port = new WS().getWSSoap();
final Client client = ClientProxy.getClient(port);
final HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
final HTTPClientPolicy httpClientPolicy = httpConduit.getClient();
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
final BindingProvider bindingProvider = (BindingProvider) port;
final Map<String, Object> requestContext = bindingProvider.getRequestContext();
final Credentials credentials = new NTCredentials("username", "password", "workstation", "domain");
requestContext.put(Credentials.class.getName(), credentials);
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://www.example.com/");
requestContext.put(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);
我已经查看了 CXF 配置页面(此处:http://cxf.apache.org/docs/configuration.html),但我看不到任何方法可以满足我的需要。
有没有一种干净的方法可以使用 spring 处理 CXF 的 NTLM 身份验证?
更新: 我已经想出如何使用以下方法强制异步管道:
<cxf:bus name="asyncBus">
<cxf:properties>
<entry key="use.async.http.conduit" value="true"/>
</cxf:properties>
</cxf:bus>
<http-conf:conduit name="{http://www.webserviceX.NET}GlobalWeatherSoapPort.http-conduit">
<http-conf:client AllowChunking="false" Connection="Keep-Alive"/>
</http-conf:conduit>
<jaxws:client id="weatherClient" bus="asyncBus"
address="http://www.webservicex.com/globalweather.asmx"
serviceClass="net.webservicex.GlobalWeatherSoap"/>
但是我仍然无法访问请求上下文,因此我可以添加我的 NTLM 凭据。
我想回答我自己的问题。经过许多小时调试和单步执行 Apache CXF 代码后,我找到了解决方案。以下 spring 配置将通过异步管道启用 NTLM 身份验证:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd">
<!--
~
~ create an asynchronous-only bus for NTLM requests
~
-->
<cxf:bus name="asyncBus">
<cxf:properties>
<entry key="use.async.http.conduit" value="true"/>
</cxf:properties>
</cxf:bus>
<!--
~
~ configure conduit for NTLM request
~
-->
<http-conf:conduit name="{http://www.webserviceX.NET}GlobalWeatherSoapPort.http-conduit">
<http-conf:client AllowChunking="false" AutoRedirect="true" Connection="Keep-Alive"/>
</http-conf:conduit>
<!--
~
~ create service stub
~
-->
<jaxws:client id="weatherClient" bus="asyncBus"
address="http://www.webservicex.com/globalweather.asmx"
serviceClass="net.webservicex.GlobalWeatherSoap">
<jaxws:properties>
<entry key="org.apache.http.auth.Credentials">
<bean class="org.apache.http.auth.NTCredentials">
<constructor-arg value="DOMAIN/USER:PASSWORD"/>
</bean>
</entry>
</jaxws:properties>
</jaxws:client>
</beans>
如有必要,也可以在 NTCredentials
构造函数中指定用户名、密码、域和工作站。