2016-07-25 3 views
0

Сегодня я пытался настроить HttpComponentsMessageSender, который использует библиотеку Apache org.apache.httpcomponents.httpclient. Раньше я использовал стандартные Java-классы (думаю, java.net.HttpUrlMessageSender или что-то в этом роде).HttpComponentMessageSender NTLM

Мои HTTP-методы должны проходить аутентификацию с использованием NTLM, а программное обеспечение работает под Linux, поэтому я не могу использовать механизм Windows по умолчанию для аутентификации, но вместо этого я должен настроить аутентификацию внутри приложения Java.

Первоначально я просто использовал пользовательскую реализацию java.net.Authenticator, которую я использовал для установления имени пользователя и пароля для доступа NTLM. Но когда я переключился на HttpComponentsMessageSender, этот подход больше не работал. Когда я попытался настроить пользовательскую конфигурацию HttpClient с помощью HttpComponentsMessageSender, я столкнулся с различными проблемами, которые, как я думал, я буду документировать здесь.

Я собираюсь опубликовать свой собственный ответ, но если у кого-то есть лучшее решение, не стесняйтесь добавлять свое решение.

ответ

0

Я решил это добавить настраиваемый объект HttpClient, который я построил с помощью HttpClientBuilder. Однако это вызвало добавление появиться следующее исключение:

org.apache.http.ProtocolException: Content-Length заголовок уже присутствует

  1. Решение, которое я нашел в this answer было добавить HttpRequestInterceptor ,
  2. Использование setConnectionTimeout на HttpComponentsMessageSender больше не работает с моим обычным HttpClient объектом. Вместо этого мне пришлось ввести объект RequestConfig в HttpClientBuilder.
  3. Объекту NTCredentials требуется имя домена в качестве параметра. Раньше, когда я использовал интерфейс Authenticator от java.net, этого было достаточно, чтобы просто указать имя пользователя и пароль.

Это код, я использую в настоящее время:

HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); 
AuthScope authscope; 
NTCredentials credentials; 
CredentialsProvider credentialsProvider; 
Registry<AuthSchemeProvider> registry; 
RequestConfig requestConfig; 

authscope = new AuthScope (HOST_IP, HOST_PORT); 

credentials = new NTCredentials ("user", "pass", null, "domain"); 

credentialsProvider = new BasicCredentialsProvider(); 

credentialsProvider.setCredentials (authscope, credentials); 

registry = RegistryBuilder.<AuthSchemeProvider>create() 
     .register(AuthSchemes.NTLM, new NTLMSchemeFactory()) 
     .build(); 

HttpRequestInterceptor interceptor 
     = (request, context) -> request.removeHeaders(HTTP.CONTENT_LEN); 

requestConfig = RequestConfig.custom() 
          .setConnectTimeout (3000) 
          .build(); 

HttpClient httpClient 
    = HttpClientBuilder.create() 
         .setDefaultRequestConfig (requestConfig) 
         .setDefaultAuthSchemeRegistry (registry) 
         .setDefaultCredentialsProvider (credentialsProvider) 
         .addInterceptorFirst (interceptor) 
         .build(); 

messageSender.setHttpClient (httpClient);