Apache CXF Async Conduit и NTLM используют 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), но не вижу способа сделать то, что мне нужно.

Есть ли чистый способ обработки NTLM-аутентификации для CXF с использованием Spring?

Обновление: я выяснил, как форсировать асинхронный канал, используя следующее:

<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.

1 ответ

Решение

Я хотел ответить на свой вопрос. После многих, многих часов отладки и пошагового выполнения кода Apache CXF я нашел решение. Следующая весенняя конфигурация включит аутентификацию 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 конструктор, если необходимо.

Другие вопросы по тегам