HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况,其实只需要在RequestConfig中setRedirectsEnabled(false)即可(默认是true):
设置RequestConfig
private RequestConfig createConfig(int timeout, boolean redirectsEnabled){ retun RequestConfig.custom() .setSocketTimeout(timeout) .setConnectTimeout(timeout) .setConnectionRequestTimeout(timeout) .setRedirectsEnabled(redirectsEnabled) .build(); } public void test(String url){ CloseableHttpClient client = HttpClients.createDefault(); try { HttpGet httpGet = new HttpGet(url); httpGet.setConfig(createConfig(5000, false)); CloseableHttpResponse response = client.execute(httpGet); try { Header h = response.getFirstHeader("Location"); if(h!=null) { System.out.println("重定向地址:"+h.getValue()); } } finally { response.close(); } } finally { client.close(); } }
另外如发生重定向,response的状态码为302,不是200。
完整工具类
package com.chengxumiao.utils; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.util.EntityUtils; import org.springframework.http.HttpMethod; import java.io.IOException; public class HttpProxy { /** * 请求配置 * * @param timeout 超时时间设置 * @param redirectsEnabled HttpClient4.3中默认允许自动重定向 * @return */ private static RequestConfig createConfig(int timeout, boolean redirectsEnabled) { return RequestConfig.custom() .setSocketTimeout(timeout) .setConnectTimeout(timeout) .setConnectionRequestTimeout(timeout) .setRedirectsEnabled(redirectsEnabled) .build(); } /** * Http 请求(Json格式参数) * * @param requestUrl * @param requestJson * @param httpMethod * @return * @throws Exception */ public static String httpRequest(String requestUrl, String requestJson, HttpMethod httpMethod) { CloseableHttpClient httpClient = null; try { httpClient = HttpClients.createDefault(); HttpResponse response; if (null == httpMethod) { throw new RuntimeException("Http Method should be Get, Post, Put"); } if (HttpMethod.GET == httpMethod) { HttpGet httpGet = new HttpGet(requestUrl); httpGet.setConfig(createConfig(5000, false)); response = httpClient.execute(httpGet); } else { HttpEntityEnclosingRequestBase requestBase = null; switch (httpMethod) { case POST: requestBase = new HttpPost(requestUrl); break; case PUT: requestBase = new HttpPut(requestUrl); break; } if (null != requestJson && !requestJson.trim().equals("")) { StringEntity requestEntity = new StringEntity(requestJson, ContentType.APPLICATION_JSON); if (requestBase != null) { requestBase.setEntity(requestEntity); } } requestBase.setConfig(createConfig(5000, false)); response = httpClient.execute(requestBase); } if (response.getStatusLine().getStatusCode() == 302) { Header h = response.getFirstHeader("Location"); if (h != null) { System.out.println("重定向地址:" + h.getValue()); return "location:"+h.getValue(); } } HttpEntity httpEntity = response.getEntity(); return EntityUtils.toString(httpEntity, "utf-8"); } catch (Exception e) { throw new RuntimeException(e); } finally { try { if (httpClient != null) { httpClient.close(); } } catch (IOException e) { e.printStackTrace(); } } } }