fix redirect bug

This commit is contained in:
looly 2021-12-25 12:49:21 +08:00
parent c51bc90146
commit ce504c2a3e
5 changed files with 56 additions and 17 deletions

View File

@ -7,6 +7,7 @@
### 🐣新特性 ### 🐣新特性
### 🐞Bug修复 ### 🐞Bug修复
* 【http 】 HttpUtil重定向次数失效问题issue#I4O28Q@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.7.18 (2021-12-25) # 5.7.18 (2021-12-25)

View File

@ -20,9 +20,10 @@ import java.net.HttpURLConnection;
public class HttpGlobalConfig implements Serializable { public class HttpGlobalConfig implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
protected static int timeout = -1; private static int timeout = -1;
private static boolean isAllowPatch = false; private static boolean isAllowPatch = false;
private static String boundary = "--------------------Hutool_" + RandomUtil.randomString(16); private static String boundary = "--------------------Hutool_" + RandomUtil.randomString(16);
private static int maxRedirectCount = 0;
/** /**
* 获取全局默认的超时时长 * 获取全局默认的超时时长
@ -62,6 +63,28 @@ public class HttpGlobalConfig implements Serializable {
boundary = customBoundary; boundary = customBoundary;
} }
/**
* 获取全局默认的最大重定向次数如设置0表示不重定向<br>
* 如果设置为1表示重定向一次即请求两次
*
* @return 全局默认的最大重定向次数
* @since 5.7.19
*/
public static int getMaxRedirectCount() {
return maxRedirectCount;
}
/**
* 设置默认全局默认的最大重定向次数如设置0表示不重定向<br>
* 如果设置为1表示重定向一次即请求两次
*
* @param customMaxRedirectCount 全局默认的最大重定向次数
* @since 5.7.19
*/
synchronized public static void setMaxRedirectCount(int customMaxRedirectCount) {
maxRedirectCount = customMaxRedirectCount;
}
/** /**
* 获取Cookie管理器用于自定义Cookie管理 * 获取Cookie管理器用于自定义Cookie管理
* *
@ -80,7 +103,7 @@ public class HttpGlobalConfig implements Serializable {
* @since 4.5.14 * @since 4.5.14
* @see GlobalCookieManager#setCookieManager(CookieManager) * @see GlobalCookieManager#setCookieManager(CookieManager)
*/ */
public static void setCookieManager(CookieManager customCookieManager) { synchronized public static void setCookieManager(CookieManager customCookieManager) {
GlobalCookieManager.setCookieManager(customCookieManager); GlobalCookieManager.setCookieManager(customCookieManager);
} }
@ -90,7 +113,7 @@ public class HttpGlobalConfig implements Serializable {
* @since 4.1.9 * @since 4.1.9
* @see GlobalCookieManager#setCookieManager(CookieManager) * @see GlobalCookieManager#setCookieManager(CookieManager)
*/ */
public static void closeCookie() { synchronized public static void closeCookie() {
GlobalCookieManager.setCookieManager(null); GlobalCookieManager.setCookieManager(null);
} }

View File

@ -206,11 +206,11 @@ public class HttpRequest extends HttpBase<HttpRequest> {
/** /**
* 默认连接超时 * 默认连接超时
*/ */
private int connectionTimeout = HttpGlobalConfig.timeout; private int connectionTimeout = HttpGlobalConfig.getTimeout();
/** /**
* 默认读取超时 * 默认读取超时
*/ */
private int readTimeout = HttpGlobalConfig.timeout; private int readTimeout = HttpGlobalConfig.getTimeout();
/** /**
* 存储表单数据 * 存储表单数据
*/ */
@ -243,7 +243,7 @@ public class HttpRequest extends HttpBase<HttpRequest> {
/** /**
* 最大重定向次数 * 最大重定向次数
*/ */
private int maxRedirectCount; private int maxRedirectCount = HttpGlobalConfig.getMaxRedirectCount();
/** /**
* Chuncked块大小0或小于0表示不设置Chuncked模式 * Chuncked块大小0或小于0表示不设置Chuncked模式
*/ */
@ -1131,8 +1131,8 @@ public class HttpRequest extends HttpBase<HttpRequest> {
.setReadTimeout(this.readTimeout)// .setReadTimeout(this.readTimeout)//
.setMethod(this.method)// .setMethod(this.method)//
.setHttpsInfo(this.hostnameVerifier, this.ssf)// .setHttpsInfo(this.hostnameVerifier, this.ssf)//
// 定义转发 // 关闭JDK自动转发采用手动转发方式
.setInstanceFollowRedirects(this.maxRedirectCount > 0) .setInstanceFollowRedirects(false)
// 流方式上传数据 // 流方式上传数据
.setChunkedStreamingMode(this.blockSize) .setChunkedStreamingMode(this.blockSize)
// 覆盖默认Header // 覆盖默认Header
@ -1174,13 +1174,8 @@ public class HttpRequest extends HttpBase<HttpRequest> {
* @return {@link HttpResponse}无转发返回 {@code null} * @return {@link HttpResponse}无转发返回 {@code null}
*/ */
private HttpResponse sendRedirectIfPossible(boolean isAsync) { private HttpResponse sendRedirectIfPossible(boolean isAsync) {
if (this.maxRedirectCount < 1) {
// 不重定向
return null;
}
// 手动实现重定向 // 手动实现重定向
if (this.httpConnection.getHttpURLConnection().getInstanceFollowRedirects()) { if (this.maxRedirectCount > 0) {
int responseCode; int responseCode;
try { try {
responseCode = httpConnection.responseCode(); responseCode = httpConnection.responseCode();
@ -1195,6 +1190,7 @@ public class HttpRequest extends HttpBase<HttpRequest> {
setUrl(httpConnection.header(Header.LOCATION)); setUrl(httpConnection.header(Header.LOCATION));
if (redirectCount < this.maxRedirectCount) { if (redirectCount < this.maxRedirectCount) {
redirectCount++; redirectCount++;
// 重定向不再走过滤器
return doExecute(isAsync, null); return doExecute(isAsync, null);
} }
} }

View File

@ -130,7 +130,7 @@ public class HttpUtil {
* @return 返回内容如果只检查状态码正常只返回 ""不正常返回 null * @return 返回内容如果只检查状态码正常只返回 ""不正常返回 null
*/ */
public static String get(String urlString) { public static String get(String urlString) {
return get(urlString, HttpGlobalConfig.timeout); return get(urlString, HttpGlobalConfig.getTimeout());
} }
/** /**
@ -177,7 +177,7 @@ public class HttpUtil {
* @return 返回数据 * @return 返回数据
*/ */
public static String post(String urlString, Map<String, Object> paramMap) { public static String post(String urlString, Map<String, Object> paramMap) {
return post(urlString, paramMap, HttpGlobalConfig.timeout); return post(urlString, paramMap, HttpGlobalConfig.getTimeout());
} }
/** /**
@ -207,7 +207,7 @@ public class HttpUtil {
* @return 返回数据 * @return 返回数据
*/ */
public static String post(String urlString, String body) { public static String post(String urlString, String body) {
return post(urlString, body, HttpGlobalConfig.timeout); return post(urlString, body, HttpGlobalConfig.getTimeout());
} }
/** /**

View File

@ -149,4 +149,23 @@ public class HttpRequestTest {
Console.log(execute.body()); Console.log(execute.body());
} }
@Test
@Ignore
public void followRedirectsTest(){
// 从5.7.19开始关闭JDK的自动重定向功能改为手动重定向
// 当有多层重定向时JDK的重定向会失效或者说只有最后一个重定向有效因此改为手动更易控制次数
// 此链接有两次重定向当设置次数为1时表示最多执行一次重定向即请求2次
String url = "http://api.rosysun.cn/sjtx/?type=2";
// String url = "https://api.btstu.cn/sjtx/api.php?lx=b1";
// 方式1全局设置
HttpGlobalConfig.setMaxRedirectCount(1);
HttpResponse execute = HttpRequest.get(url).execute();
Console.log(execute.getStatus(), execute.header(Header.LOCATION));
// 方式2单独设置
execute = HttpRequest.get(url).setMaxRedirectCount(1).execute();
Console.log(execute.getStatus(), execute.header(Header.LOCATION));
}
} }