Java >> Java Tutorial >  >> Tag >> Spring

Spring From the Trenches:Deaktivieren der Cookie-Verwaltung von Apache HTTP Client 4 und RestTemplate

Letzte Woche erhielt ich einen Fehlerbericht von einem API-Anbieter. Der Fehlerbericht besagt, dass unsere Anwendung den Load Balancer des API-Anbieters umgangen hat, weil der Apache HTTP-Client die vom Load Balancer gesetzten Cookies nicht ignoriert hat.

Dies war ein großes Problem für uns, da dieser Fehler unnötige Fehler verursachen konnte, wenn der API-Anbieter seine Server aktualisierte. Erschwerend kommt hinzu, dass diese API für unsere Anwendung unerlässlich ist und wir uns wirklich keine unnötigen Ausfallzeiten leisten können.

Lassen Sie uns herausfinden, wie wir dieses Problem beheben können.

Apache HTTP Client 4 mit RestTemplate verwenden

Standardmäßig ist das RestTemplate -Klasse erstellt HTTP-Anforderungen unter Verwendung der Standardklassen von java.net Paket. Da wir für diesen Zweck den Apache HTTP-Client verwenden möchten, müssen wir die folgenden Änderungen an unserer Anwendungskontext-Konfigurationsklasse vornehmen:

  1. Erstellen Sie eine neue ClientHttpRequestFactory Bohne. Da wir den Apache HTTP-Client verwenden möchten, müssen wir eine neue HttpComponentsClientHttpRequestFactory erstellen -Objekt und konfigurieren Sie die Verbindungs- und Lesezeitüberschreitungen des zugrunde liegenden Apache HTTP-Clients.
  2. Erstellen Sie ein neues RestTemplate Bean und konfigurieren Sie die verwendete ClientHttpRequestFactory Objekt.

Der Quellcode unserer Anwendungskontext-Konfigurationsklasse sieht wie folgt aus:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfiguration {

   	@Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = 
				new HttpComponentsClientHttpRequestFactory();
        
		factory.setConnectTimeout(5000);
        factory.setReadTimeout(10000);
        
		return factory;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        return new RestTemplate(clientHttpRequestFactory);
    }
}

Als nächstes müssen wir sicherstellen, dass der Apache HTTP-Client alle Cookies ignoriert.

Cookies des Apache HTTP Client 4 deaktivieren

Wenn wir die Cookie-Verwaltung des Apache HTTP-Clients deaktivieren möchten, der von RestTemplate verwendet wird Klasse (oder ihre Konfiguration auf irgendeine Weise ändern), müssen wir einen neuen HttpClient erstellen -Objekt mithilfe des HttpClientBuilder Klasse und stellen Sie sicher, dass unser RestTemplate Bean verwendet den erstellten HttpClient Objekt.

Nachdem wir einen neuen HttpClient erstellt haben Objekt, das Cookies ignoriert und seine Konfiguration mithilfe von Systemeigenschaften liest, sieht der Quellcode unserer Anwendungskontext-Konfigurationsklasse wie folgt aus:

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfiguration {

   	@Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = 
				new HttpComponentsClientHttpRequestFactory();
        
		factory.setConnectTimeout(5000);
        factory.setReadTimeout(10000);
        
		HttpClient httpClient = HttpClientBuilder.create()
		                .disableCookieManagement()
		                .useSystemProperties()
		                .build();
		factory.setHttpClient(httpClient);
		
		return factory;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        return new RestTemplate(clientHttpRequestFactory);
    }
}

Fassen wir zusammen, was wir aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat uns drei Dinge gelehrt:

  • Wenn wir sicherstellen wollen, dass die RestTemplate verwendet den Apache HTTP-Client anstelle des standardmäßigen java.net Klassen müssen wir eine neue HttpComponentsClientHttpRequestFactory erstellen Objekt und stellen Sie sicher, dass das RestTemplate Bean verwendet das erstellte Objekt.
  • Wir können einen neuen HttpClient erstellen Objekte mithilfe des HttpClientBuilder Klasse.
  • Wenn wir die Konfiguration des zugrunde liegenden Apache HTTP-Clients ändern wollen, müssen wir einen neuen HttpClient erstellen -Objekt und stellen Sie sicher, dass die HttpComponentsClientHttpRequestFactory Objekt verwendet das erstellte Objekt.

Java-Tag