복붙노트

[SPRING] 스프링 3.1에서 기본 인증을 사용하여 RestTemplate

SPRING

스프링 3.1에서 기본 인증을 사용하여 RestTemplate

우리는 Spring 3.0에서 RestTemplate을 xml 구성과 함께 사용하고 있었고 완벽하게 작동했습니다.

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <!--  <constructor-arg ref="httpClientParams"/> --> 
</bean>

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean>  

  <bean id="restTemplate" name="restTemplate" class="org.springframework.web.client.RestTemplate" autowire-candidate="true">
        <constructor-arg ref="httpClientFactory" />

    <property name="messageConverters"> 
        <list> 
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            </bean> 
            <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        </list> 
    </property>
  </bean>

그러나 Spring 3.1 릴리스로 마이그레이션하려고 할 때 CommonsClientHttpRequestFactory 클래스는 더 이상 사용되지 않으며 커밋 HonspClient는 더 이상 사용되지 않습니다.

HttpComponentsClientHttpRequestFactory 클래스와 Apache HttpClient를 사용하여 유사한 설정을 설정하려했지만 Credential Provider를 설정하는 방법을 알지 못했습니다.

기본 인증을 사용하여 httpclient를 원합니다. 아무도 이것을 한 적이 없거나 어떤 포인터가 큰 도움이 될 수 있습니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.나는이 일을 마침내 얻을 수있었습니다. 그것이 최선인지 아닌지, 이것이 나를 위해 일한 첫 번째 해결책.

    나는이 일을 마침내 얻을 수있었습니다. 그것이 최선인지 아닌지, 이것이 나를 위해 일한 첫 번째 해결책.

    `

    <!-- Credentials provider needed by apache default http client -->
    <bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" />
    
    <!-- Used to invoke a method in BasicCredentialsProvider.  This has to be done this way as BasicCredentialsProvider does not take 
    provider and credentials in constructor or setter method.  It has to set by invoking setCredentials() method and passing two arguments -->  
    <bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject"><ref local="credentialProvider" /> </property>
        <property name="targetMethod" value="setCredentials"> </property>
        <property name="arguments"  >
            <list>
                <ref local="authScope" />
                <ref local="credentials" />
            </list>
        </property>
    </bean>
    
    <!-- Authorization scope for accessing restful service.  Since we want this template to be used for everything, we are setting up it with defaults -->
    <bean id="authScope" class="org.apache.http.auth.AuthScope">
        <constructor-arg name="host"><null /></constructor-arg>
        <constructor-arg><value>-1</value> </constructor-arg>
        <constructor-arg><null /></constructor-arg>
        <constructor-arg><null /></constructor-arg>
    </bean>
    
    <!-- Username and Password Credentials to access restful service -->
    <bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials">
        <constructor-arg name="userName"><value>xxx</value></constructor-arg>
        <constructor-arg name="password"><value>xxx</value></constructor-arg>
    </bean>
    
    <!-- Client factory which uses Apache HttpClient implementation.  Note that it DO NOT use apache commons httpclient -->
    <bean id="httpClientFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
        <constructor-arg ref="httpClient"/> 
    </bean>
    
    <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
        <property name="credentialsProvider" ref="credentialProvider"/>
    </bean>
    
    <!-- Rest template for Spring 3.1. Used HttpClientFactory to make request -->
      <bean id="restTemplate" name="restTemplate" class="org.springframework.web.client.RestTemplate" autowire-candidate="true">
            <constructor-arg ref="httpClientFactory" />
    
        <property name="messageConverters"> 
            <list> 
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                </bean> 
                <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
                <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            </list> 
        </property>
      </bean>`
    
  2. ==============================

    2.나는 이것을 Spring 4 RestTemplate로 처리 할 수있다.

    나는 이것을 Spring 4 RestTemplate로 처리 할 수있다.

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
            <constructor-arg ref="httpClientFactory" />
        </bean>
    
        <bean id="httpClientFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
             <constructor-arg ref="httpClient" />
        </bean> 
    
        <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />
    
        <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
            <property name="defaultRequestConfig" ref="requestConfig" />
            <property name="defaultCredentialsProvider" ref="credentialProvider"/>
        </bean>
    
        <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
    
        <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
            <property name="socketTimeout" value="${MILLISEC`enter code here`ONDS}" /> 
            <property name="connectTimeout" value="${MILLISECONDS}" /> 
        </bean> 
    
    <bean id="credentials" class="org.apache.http.auth.NTCredentials">
            <constructor-arg value="${USER}" />
            <constructor-arg value="${PASSWORD}" />
            <constructor-arg value="" />
            <constructor-arg value="${DOMAIN}" />
        </bean>
    
        <bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" />
    
        <!-- This is used to invoke a method in BasicCredentialsProvider.  This has to be done this way as BasicCredentialsProvider does not take 
        provider and credentials in constructor or setter method.  It has to set by invoking setCredentials() method and passing two arguments -->  
        <bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetObject" ref="credentialProvider" /> 
            <property name="targetMethod" value="setCredentials" />
            <property name="arguments"  >
                <list>
                    <ref bean="authScope" />
                    <ref bean="credentials" />
                </list>
            </property>
        </bean>
    
        <!-- Authorization scope for accessing restful service. Since we want this template to be used for everything, we are setting up it with defaults -->
        <bean id="authScope" class="org.apache.http.auth.AuthScope">
            <constructor-arg name="host"><null /></constructor-arg>
            <constructor-arg><value>-1</value> </constructor-arg>
            <constructor-arg><null /></constructor-arg>
            <constructor-arg><null /></constructor-arg>
        </bean>
    
  3. from https://stackoverflow.com/questions/9048812/resttemplate-with-basic-auth-in-spring-3-1 by cc-by-sa and MIT license