1. 引言

理解URL重定向在Web开发和网络编程任务中至关重要,例如处理HTTP请求的重定向、验证URL重定向或提取最终目标URL。在Java中,我们可以使用HttpURLConnectionHttpClient库来实现这一功能。

在这篇教程中,我们将探讨在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上找到