I'm connecting to a remote server with apache http client. the remote server sends a redirect, and i want to achieve that my client isn't following the redirect automatically so that i can extract the propper header and do whatever i want with the target.
i'm looking for a simple working code sample (copy paste) that stops the automatic redirect following behaviour.
i found Preventing HttpClient 4 from following redirect, but it seems i'm too stupid to implement it with HttpClient 4.0 (GA)
The default HttpClient implementation is pretty limited in configurability, but you can control the redirect handling by using HttpClient's boolean parameter http.protocol.handle-redirects.
See the docs for reference.
The magic, thanks to macbirdie , is:
params.setParameter("http.protocol.handle-redirects",false);
Imports are left out, here's a copy paste sample:
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.
}
This worked for me:
HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);
Using HttpClient 4.3 and 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();
Rather than use the property directly you can use:
final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
GetMethod method = new GetMethod(url);
method.setFollowRedirects(false);
To avoid automatic redirection header, one must first configure the request to not do automatic redirects. You can do this by calling HttPClientParams.setRedirection and set it to false. Code snippet is shown below:
HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
Before HttpClient 4.3
In older versions of the Http Client (before 4.3), we can configure what the client does with redirects as follows:
@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));
}
Notice the alternative API that can be used to configure the redirect behavior without using setting the actual raw http.protocol.handle-redirects parameter:
HttpClientParams.setRedirecting(params, false);
Also notice that, with follow redirects disabled, we can now check that the Http Response status code is indeed 301 Moved Permanently – as it should be.
After HttpClient 4.3
HttpClient 4.3 introduced a cleaner, more high level API to build and configure the client:
@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));
}
Note that the new API configures the entire client with this redirect behavior – not just the individual request. Reference: http://www.baeldung.com/httpclient-stop-follow-redirect
instead of call HttpClientBuilder directly, you can use
HttpClients.custom().disableRedirectHandling().build();
For HttURLConnection they have exposed an api. So that, if it detects any auto-redirection then it will return 302 response code instead of 200. So that by tracking response code we can easily track that either it is an redirect Url or not.
HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL("http://www.redirecturl.com").openConnection());
httpURLConnection.setInstanceFollowRedirects(false);
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode(); //302 in case of redirection.
this worked for me CloseableHttpClient client = HttpClientBuilder.create().disableRedirectHandling().build();
来源:https://stackoverflow.com/questions/1519392/how-to-prevent-apache-http-client-from-following-a-redirect