diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpConfig.java b/hutool-http/src/main/java/cn/hutool/http/HttpConfig.java index 8ca0d643b..8e31518af 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpConfig.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpConfig.java @@ -90,6 +90,11 @@ public class HttpConfig { */ boolean interceptorOnRedirect; + /** + * 自动重定向时是否处理cookie + */ + boolean followRedirectsCookie; + /** * 设置超时,单位:毫秒
* 超时包括: @@ -297,4 +302,14 @@ public class HttpConfig { this.interceptorOnRedirect = interceptorOnRedirect; return this; } + + /** + * 自动重定向时是否处理cookie + * @param followRedirectsCookie 自动重定向时是否处理cookie + * @return this + */ + public HttpConfig setFollowRedirectsCookie(boolean followRedirectsCookie) { + this.followRedirectsCookie = followRedirectsCookie; + return this; + } } diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java index acd397f7b..be9f23212 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java @@ -26,11 +26,7 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSocketFactory; import java.io.File; import java.io.IOException; -import java.net.CookieManager; -import java.net.HttpCookie; -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.URLStreamHandler; +import java.net.*; import java.nio.charset.Charset; import java.util.Collection; import java.util.Map; @@ -866,6 +862,16 @@ public class HttpRequest extends HttpBase { return this; } + /** + * 自动重定向时是否处理cookie + * @param followRedirectsCookie 自动重定向时是否处理cookie + * @return this + */ + public HttpRequest setFollowRedirectsCookie(boolean followRedirectsCookie) { + config.setFollowRedirectsCookie(followRedirectsCookie); + return this; + } + /** * 设置最大重定向次数
* 如果次数小于1则表示不重定向,大于等于1表示打开重定向 @@ -1264,7 +1270,10 @@ public class HttpRequest extends HttpBase { this.httpConnection.disconnectQuietly(); throw new HttpException(e); } - + //支持自动重定向时处理cookie + if (config.followRedirectsCookie) { + GlobalCookieManager.store(httpConnection); + } if (responseCode != HttpURLConnection.HTTP_OK) { if (HttpStatus.isRedirected(responseCode)) { final UrlBuilder redirectUrl; diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java index 62fa14cd0..5ecb76989 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java @@ -9,6 +9,8 @@ import cn.hutool.core.util.CharsetUtil; import org.junit.Ignore; import org.junit.Test; +import java.net.CookieManager; +import java.net.HttpCookie; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -169,6 +171,33 @@ public class HttpRequestTest { Console.log(execute.getStatus(), execute.header(Header.LOCATION)); } + @Test + @Ignore + public void followRedirectsCookieTrueTest() { + final String url = "http://localhost:8888/redirect1"; + CookieManager cookieManager = new CookieManager(); + HttpRequest.setCookieManager(cookieManager); + HttpResponse execute = HttpRequest.get(url) + .setMaxRedirectCount(20) + .setFollowRedirectsCookie(true) + .execute(); + List cookies = cookieManager.getCookieStore().getCookies(); + Console.log(execute.getStatus(), cookies); + } + + @Test + @Ignore + public void followRedirectsCookieFalseTest() { + final String url = "http://localhost:8888/redirect1"; + CookieManager cookieManager = new CookieManager(); + HttpRequest.setCookieManager(cookieManager); + HttpResponse execute = HttpRequest.get(url) + .setMaxRedirectCount(20) + .execute(); + List cookies = cookieManager.getCookieStore().getCookies(); + Console.log(execute.getStatus(), cookies); + } + @Test @Ignore public void addInterceptorTest() { diff --git a/hutool-http/src/test/java/cn/hutool/http/server/RedirectServerTest.java b/hutool-http/src/test/java/cn/hutool/http/server/RedirectServerTest.java new file mode 100644 index 000000000..e818e370f --- /dev/null +++ b/hutool-http/src/test/java/cn/hutool/http/server/RedirectServerTest.java @@ -0,0 +1,29 @@ +package cn.hutool.http.server; + +import cn.hutool.core.lang.Console; +import cn.hutool.http.Header; +import cn.hutool.http.HttpUtil; + +public class RedirectServerTest { + + public static void main(String[] args) { + HttpUtil.createServer(8888).addAction("/redirect1", (request, response) -> { + response.addHeader(Header.LOCATION.getValue(),"http://localhost:8888/redirect2"); + response.addHeader(Header.SET_COOKIE.getValue(),"redirect1=1; path=/; HttpOnly"); + response.send(301); + }).addAction("/redirect2", (request, response) -> { + response.addHeader(Header.LOCATION.getValue(),"http://localhost:8888/redirect3"); + response.addHeader(Header.SET_COOKIE.getValue(), "redirect2=2; path=/; HttpOnly"); + response.send(301); + }).addAction("/redirect3", (request, response) -> { + response.addHeader(Header.LOCATION.getValue(),"http://localhost:8888/redirect4"); + response.addHeader(Header.SET_COOKIE.getValue(),"redirect3=3; path=/; HttpOnly"); + response.send(301); + }).addAction("/redirect4", (request, response) -> { + String cookie = request.getHeader(Header.COOKIE); + Console.log(cookie); + response.sendOk(); + }).start(); + } + +}