mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix redirect bug
This commit is contained in:
parent
c51bc90146
commit
ce504c2a3e
@ -7,6 +7,7 @@
|
||||
|
||||
### 🐣新特性
|
||||
### 🐞Bug修复
|
||||
* 【http 】 HttpUtil重定向次数失效问题(issue#I4O28Q@Gitee)
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
# 5.7.18 (2021-12-25)
|
||||
|
@ -20,9 +20,10 @@ import java.net.HttpURLConnection;
|
||||
public class HttpGlobalConfig implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
protected static int timeout = -1;
|
||||
private static int timeout = -1;
|
||||
private static boolean isAllowPatch = false;
|
||||
private static String boundary = "--------------------Hutool_" + RandomUtil.randomString(16);
|
||||
private static int maxRedirectCount = 0;
|
||||
|
||||
/**
|
||||
* 获取全局默认的超时时长
|
||||
@ -62,6 +63,28 @@ public class HttpGlobalConfig implements Serializable {
|
||||
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管理
|
||||
*
|
||||
@ -80,7 +103,7 @@ public class HttpGlobalConfig implements Serializable {
|
||||
* @since 4.5.14
|
||||
* @see GlobalCookieManager#setCookieManager(CookieManager)
|
||||
*/
|
||||
public static void setCookieManager(CookieManager customCookieManager) {
|
||||
synchronized public static void setCookieManager(CookieManager customCookieManager) {
|
||||
GlobalCookieManager.setCookieManager(customCookieManager);
|
||||
}
|
||||
|
||||
@ -90,7 +113,7 @@ public class HttpGlobalConfig implements Serializable {
|
||||
* @since 4.1.9
|
||||
* @see GlobalCookieManager#setCookieManager(CookieManager)
|
||||
*/
|
||||
public static void closeCookie() {
|
||||
synchronized public static void closeCookie() {
|
||||
GlobalCookieManager.setCookieManager(null);
|
||||
}
|
||||
|
||||
|
@ -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模式
|
||||
*/
|
||||
@ -1131,8 +1131,8 @@ public class HttpRequest extends HttpBase<HttpRequest> {
|
||||
.setReadTimeout(this.readTimeout)//
|
||||
.setMethod(this.method)//
|
||||
.setHttpsInfo(this.hostnameVerifier, this.ssf)//
|
||||
// 定义转发
|
||||
.setInstanceFollowRedirects(this.maxRedirectCount > 0)
|
||||
// 关闭JDK自动转发,采用手动转发方式
|
||||
.setInstanceFollowRedirects(false)
|
||||
// 流方式上传数据
|
||||
.setChunkedStreamingMode(this.blockSize)
|
||||
// 覆盖默认Header
|
||||
@ -1174,13 +1174,8 @@ public class HttpRequest extends HttpBase<HttpRequest> {
|
||||
* @return {@link HttpResponse},无转发返回 {@code null}
|
||||
*/
|
||||
private HttpResponse sendRedirectIfPossible(boolean isAsync) {
|
||||
if (this.maxRedirectCount < 1) {
|
||||
// 不重定向
|
||||
return null;
|
||||
}
|
||||
|
||||
// 手动实现重定向
|
||||
if (this.httpConnection.getHttpURLConnection().getInstanceFollowRedirects()) {
|
||||
if (this.maxRedirectCount > 0) {
|
||||
int responseCode;
|
||||
try {
|
||||
responseCode = httpConnection.responseCode();
|
||||
@ -1195,6 +1190,7 @@ public class HttpRequest extends HttpBase<HttpRequest> {
|
||||
setUrl(httpConnection.header(Header.LOCATION));
|
||||
if (redirectCount < this.maxRedirectCount) {
|
||||
redirectCount++;
|
||||
// 重定向不再走过滤器
|
||||
return doExecute(isAsync, null);
|
||||
}
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ public class HttpUtil {
|
||||
* @return 返回内容,如果只检查状态码,正常只返回 "",不正常返回 null
|
||||
*/
|
||||
public static String get(String urlString) {
|
||||
return get(urlString, HttpGlobalConfig.timeout);
|
||||
return get(urlString, HttpGlobalConfig.getTimeout());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -177,7 +177,7 @@ public class HttpUtil {
|
||||
* @return 返回数据
|
||||
*/
|
||||
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 返回数据
|
||||
*/
|
||||
public static String post(String urlString, String body) {
|
||||
return post(urlString, body, HttpGlobalConfig.timeout);
|
||||
return post(urlString, body, HttpGlobalConfig.getTimeout());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -149,4 +149,23 @@ public class HttpRequestTest {
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user