1. 引言
理解URL重定向在Web开发和网络编程任务中至关重要,例如处理HTTP请求的重定向、验证URL重定向或提取最终目标URL。在Java中,我们可以使用HttpURLConnection
或HttpClient
库来实现这一功能。
在这篇教程中,我们将探讨在Java中查找给定URL重定向地址的不同方法。
2. 使用HttpURLConnection
Java提供了HttpURLConnection
类,它允许我们发送HTTP请求并处理响应。我们也可以利用HttpURLConnection
来查找给定URL的重定向地址。以下是实现步骤:
String canonicalUrl = "http://www.baeldung.com/";
String expectedRedirectedUrl = "https://www.baeldung.com/";
@Test
public void givenOriginalUrl_whenFindRedirectUrlUsingHttpURLConnection_thenCorrectRedirectedUrlReturned() throws IOException {
URL url = new URL(canonicalUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setInstanceFollowRedirects(true);
int status = connection.getResponseCode();
String redirectedUrl = null;
if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP) {
redirectedUrl = connection.getHeaderField("Location");
}
connection.disconnect();
assertEquals(expectedRedirectedUrl, redirectedUrl);
}
这里定义了原始URL字符串(canonicalUrl
)和预期的重定向URL(expectedRedirectedUrl
)。然后,我们创建一个HttpURLConnection
对象,并连接到原始URL。
接着,我们将instanceFollowRedirects
属性设置为true
,以启用自动重定向。收到响应后,我们检查状态码以确定是否发生了重定向。如果发生重定向,我们从“Location”头中获取重定向的URL。
最后,断开连接,并断言获取到的重定向URL与预期的一致。
3. 使用Apache HttpClient
另一种选择是使用Apache的HttpClient
,这是一个更灵活的Java HTTP客户端库。Apache HttpClient
提供了更先进的特性和更好的HTTP请求和响应处理支持。以下是使用HttpClient
查找重定向URL的方法:
@Test
public void givenOriginalUrl_whenFindRedirectUrlUsingHttpClient_thenCorrectRedirectedUrlReturned() throws IOException {
RequestConfig config = RequestConfig.custom()
.setRedirectsEnabled(false)
.build();
try (CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config).build()) {
HttpGet httpGet = new HttpGet(canonicalUrl);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
int statusCode = response.getStatusLine().getStatusCode();
String redirectedUrl = null;
if (statusCode == HttpURLConnection.HTTP_MOVED_PERM || statusCode == HttpURLConnection.HTTP_MOVED_TEMP) {
org.apache.http.Header[] headers = response.getHeaders("Location");
if (headers.length > 0) {
redirectedUrl = headers[0].getValue();
}
}
assertEquals(expectedRedirectedUrl, redirectedUrl);
}
}
}
在这个测试中,我们首先配置请求以禁用自动重定向。然后,我们创建一个CloseableHttpClient
实例,并向原始URL发送一个HttpGet
请求。
获取响应后,我们分析状态码和头信息来确认是否发生了重定向。如果发生重定向,我们从Location
头中提取重定向URL。
4. 总结
在这篇文章中,我们讨论了正确处理重定向对于构建与外部资源交互的健壮Web应用的重要性。我们探讨了如何使用HttpURLConnection
和Apache HttpClient
查找给定URL的重定向地址。
如往常一样,相关的源代码可以在GitHub上找到。