2016-07-25 20 views
0

Heute habe ich versucht, die HttpComponentsMessageSender zu konfigurieren, die Apaches org.apache.httpcomponents.httpclient Bibliothek verwendet. Bevor ich die Standard-Java-Klassen verwendet habe (ich denke java.net.HttpUrlMessageSender oder etwas in dieser Richtung).HttpComponentMessageSender NTLM

Meine HTTP-Methoden müssen mit NTLM authentifiziert werden, und die Software läuft unter Linux, daher kann ich nicht den Windows-Standardmechanismus für die Authentifizierung verwenden, sondern muss die Authentifizierung innerhalb der Java-Anwendung konfigurieren.

Ursprünglich verwendete ich nur eine benutzerdefinierte Implementierung von java.net.Authenticator, die ich verwendet, um den Benutzernamen und das Kennwort für den NTLM-Zugriff festzulegen. Aber als ich zu HttpComponentsMessageSender wechselte, funktionierte dieser Ansatz nicht mehr. Als ich versuchte, eine benutzerdefinierte HttpClient Konfiguration mit dem HttpComponentsMessageSender einzurichten, stieß ich auf verschiedene Probleme, von denen ich dachte, dass ich sie hier dokumentieren würde.

Ich werde meine eigene Antwort posten, aber wenn jemand eine bessere Lösung hat, zögern Sie nicht, Ihre Lösung hinzuzufügen.

Antwort

0

Ich löste das Hinzufügen eines benutzerdefinierten Build HttpClient Objekt, das ich mit der HttpClientBuilder gebaut. Jedoch Addiert man diese verursacht die folgende Ausnahme angezeigt:

org.apache.http.ProtocolException: Content-Length-Header bereits

  1. Die Lösung, die ich in this answer fand, war eine HttpRequestInterceptor hinzufügen .
  2. Die setConnectionTimeout auf der HttpComponentsMessageSender funktioniert nicht mehr mit meinem benutzerdefinierten HttpClient Objekt. Stattdessen musste ich ein RequestConfig Objekt in die HttpClientBuilder injizieren.
  3. Das Objekt NTCredentials benötigt den Domänennamen als Parameter. Früher, als ich die Authenticator Schnittstelle von java.net benutzte, war es genug, nur den Benutzernamen und das Passwort zu liefern.

Dies ist der Code, den ich zur Zeit bin mit:

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);