Java URLConnection.getURL()仅在调用看似未连接的方法后重定向

Java URLConnection.getURL()仅在调用看似未连接的方法后重定向,java,urlconnection,Java,Urlconnection,下面的代码应该打印出一个网站的新位置,该网站使用location标题重定向到一个新页面/文件(http://somepagethatredirects.me/after.txt): 即使我们希望位置是http://somepagethatredirects.me/after.txt,我们将获得指定的URL参数 添加像urlConnection.getHeaderField(“Location”)、urlConnection.getHeaderFields()甚至urlConnection.get

下面的代码应该打印出一个网站的新位置,该网站使用
location
标题重定向到一个新页面/文件(
http://somepagethatredirects.me/after.txt
):

即使我们希望位置是
http://somepagethatredirects.me/after.txt
,我们将获得指定的URL参数

添加像
urlConnection.getHeaderField(“Location”)
urlConnection.getHeaderFields()
甚至
urlConnection.getExpiration()
这样的(看似未连接的)方法将(奇怪地)给我们带来预期的结果:

URL website = new URL("http://somepagethatredirects.me/before.txt");
URLConnection urlConnection = website.openConnection();
urlConnection.getHeaderFields();
System.out.println(urlConnection.getURL());
这是故意的行为吗?对我来说,这好像是一只虫子


编辑1: 正如Jeffrey Bosbom指出的那样,调用
urlConnection.openConnection()
实际上并不会建立到服务器的连接,
urlConnection.connect()
确实会建立连接(或其他暗示活动连接的方法)。但是,这不会改变程序的输出:

URL website = new URL("http://somepagethatredirects.me/before.txt");
URLConnection urlConnection = website.openConnection();
urlConnection.connect();
System.out.println(urlConnection.getURL());

HTTP事务不会发生任何变化,除非您:

  • 获取响应代码
  • 打开输入流
  • 打开错误流

我不确定,即使在这之后,您是否有任何理由期望
getURL()
交付最终的目标URL。

@JeffreyBosboom好主意,但是
urlConnection.connect()
也不会“更新”URL,我只是检查了一下。我将把它添加到问题中的方法中,并编写另一段示例代码。返回您连接到的原始url,而不是
位置
标题,在通过调用
connect
@Dummy建立连接之前,您无法从您连接到的url读取任何内容。我不明白为什么
urlConnection.getURL()
返回调用
urlConnection.getHeaderFields()
urlConnection.getExpiration()
后重定向到的新URL。这很奇怪,因为行为与API文档不一致,您可能需要查看这些方法的源代码以了解实际情况。但是
getURL()
不应返回除您根据文档连接到的原始url之外的任何内容。它返回传递给
URLConnection
类的受保护字段urlconstructor@Dummy正如你在原始问题中看到的,我也在想同样的问题;我没想到会看到这些结果。您可以尝试在自己的PC上执行它,其中的某个页面执行
位置
重定向。出于某种奇怪的原因,
urlConnection.getHeaderFields()
或我列出的任何方法似乎都在修改URL字段。
URL website = new URL("http://somepagethatredirects.me/before.txt");
URLConnection urlConnection = website.openConnection();
urlConnection.connect();
System.out.println(urlConnection.getURL());