2016-07-25 3 views
0

오늘은 org.apache.httpcomponents.httpclient 라이브러리를 사용하는 HttpComponentsMessageSender을 구성하려고했습니다. 전에 내가 표준 자바 클래스 (나는 그 라인을 따라 java.net.HttpUrlMessageSender 또는 뭔가를 생각)을 사용합니다.HttpComponentMessageSender NTLM

내 HTTP 메서드는 NTLM을 사용하여 인증해야하며 소프트웨어는 Linux에서 실행되므로 기본 Windows 메커니즘을 사용하여 인증을 수행 할 수는 없지만 대신 Java 응용 프로그램에서 인증을 구성해야합니다.

원래 NTLM 액세스를 위해 사용자 이름과 암호를 으로 설정하는 데 사용했던 java.net.Authenticator의 사용자 지정 구현을 사용하고있었습니다. 그러나 HttpComponentsMessageSender으로 전환했을 때이 접근 방식은 더 이상 작동하지 않았습니다. HttpComponentsMessageSender으로 사용자 정의 HttpClient 구성을 설정하려고 할 때 여러 가지 문제가 발생하여 여기서 문서화 할 수 있다고 생각했습니다.

내 답변을 게시 할 예정이지만 누구에게 더 나은 해결책이 있다면 솔루션을 추가하십시오.

답변

0

HttpClientBuilder으로 구축 한 사용자 정의 빌드 HttpClient 오브젝트를 추가하여이를 해결했습니다.

org.apache.http.ProtocolException을 : 내가 this answer에서 발견 된 솔루션은 HttpRequestInterceptor을 추가

  • 했다

    1. 이미 존재하는 콘텐츠 길이 헤더 그러나 이것은 다음과 같은 예외를 표시 인한 부가하는 .
    2. HttpComponentsMessageSender에있는 setConnectionTimeout을 사용하면 내 맞춤형 HttpClient 개체에서 더 이상 작동하지 않습니다. 대신 RequestConfig 개체를 HttpClientBuilder에 삽입해야했습니다.
    3. NTCredentials 개체는 도메인 이름을 매개 변수로 필요로합니다. 이전에 java.netAuthenticator 인터페이스를 사용할 때 사용자 이름과 비밀번호를 제공하기 만하면되었습니다.

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

    이 내가 현재 사용하고있는 코드입니다