Jak uniemożliwić klientowi http apache podążanie za przekierowaniem

Łączę się ze zdalnym serwerem za pomocą klienta http apache. zdalny serwer wysyła przekierowanie, a ja chcę osiągnąć, że mój klient nie podąża za przekierowaniem automatycznie tak, że mogę wyodrębnić nagłówek propper i zrobić co chcę z celem.

Szukam prostego przykładowego kodu roboczego (copy paste) , który zatrzymuje automatyczne przekierowanie po zachowaniu.

Znalazłem uniemożliwiając HttpClient 4 śledzenie redirect , ale wydaje mi się, że jestem zbyt głupi, aby zaimplementować go z HttpClient 4.0 (GA)

Author: Community, 2009-10-05

10 answers

Domyślna implementacja HttpClient jest dość ograniczona w konfigurowalności, ale możesz kontrolować obsługę przekierowań za pomocą parametru boolean HttpClient http.protocol.handle-redirects.

Zobacz docs w celach informacyjnych.

 16
Author: macbirdie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 12:46:51

Magia, dzięki macbirdie , to:

params.setParameter("http.protocol.handle-redirects",false);

Import jest pominięty, oto przykład kopiuj wklej:

HttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();

// HTTP parameters stores header etc.
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects",false);

// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();

// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

// connect and receive 
HttpGet httpget = new HttpGet("http://localhost/web/redirect");
httpget.setParams(params);
response = httpclient.execute(httpget, localContext);

// obtain redirect target
Header locationHeader = response.getFirstHeader("location");
if (locationHeader != null) {
    redirectLocation = locationHeader.getValue();
  System.out.println("loaction: " + redirectLocation);
} else {
  // The response is invalid and did not provide the new location for
  // the resource.  Report an error or possibly handle the response
  // like a 404 Not Found error.
}
 49
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:20

Przy użyciu HttpClient 4.3 i Fluent:

final String url = "http://...";
final HttpClient client = HttpClientBuilder.create()
    .disableRedirectHandling()
    .build();
final Executor executor = Executor.newInstance(client);
final HttpResponse response = executor.execute(Request.Get(url))
    .returnResponse();
 27
Author: David Riccitelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 15:49:44

To mi pomogło:

HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);
 23
Author: Caner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-09 12:52:56

Zamiast używać właściwości bezpośrednio możesz użyć:

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
 12
Author: David Koski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-15 05:29:25

Przed HttpClient 4.3

W starszych wersjach klienta Http (przed 4.3) możemy skonfigurować co klient robi z przekierowaniami w następujący sposób:

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient instance = new DefaultHttpClient();

    HttpParams params = new BasicHttpParams();
    params.setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    // HttpClientParams.setRedirecting(params, false); // alternative

    HttpGet httpGet = new HttpGet("http:/testabc.com");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

Zwróć uwagę na alternatywne API, które może być użyte do skonfigurowania zachowania przekierowania bez używania ustawiania rzeczywistego surowego http.protokół.parametr handle-redirects:

HttpClientParams.setRedirecting(params, false);

Zauważ również, że po wyłączeniu śledzenia przekierowań możemy teraz sprawdzić, czy kod statusu odpowiedzi Http rzeczywiście został przeniesiony 301 Na stałe – tak jak powinno być.

Po HttpClient 4.3

HttpClient 4.3 wprowadził czystsze, bardziej zaawansowane API do budowania i konfigurowania klienta:

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
    HttpResponse response = instance.execute(new HttpGet("http://testabc.com"));

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

Zauważ, że nowe API konfiguruje całego klienta z takim zachowaniem przekierowania – a nie tylko pojedyncze żądanie. Numer referencyjny: http://www.baeldung.com/httpclient-stop-follow-redirect

 2
Author: Fan Jin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 06:27:17

To zadziałało na mnie CloseableHttpClient client = HttpClientBuilder.create().disableRedirectHandling().build()

 1
Author: Pravin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-22 12:40:41
GetMethod method = new GetMethod(url);
method.setFollowRedirects(false); 
 0
Author: user769733,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 09:01:27

Aby uniknąć automatycznego przekierowania nagłówka, należy najpierw skonfigurować żądanie, aby nie robić automatycznych przekierowań. Możesz to zrobić, wywołując HttPClientParams.setRedirection i ustawiając ją na false. Fragment kodu jest pokazany poniżej:

HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
 0
Author: Simple-Solution,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 10:36:11

Zamiast wywoływać HttpClientBuilder bezpośrednio, możesz użyć

HttpClients.custom().disableRedirectHandling().build();
 0
Author: liuck8080,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 08:15:05