URLConnection.getURL 方法
Posted
技术标签:
【中文标题】URLConnection.getURL 方法【英文标题】:URLConnection.getURL method 【发布时间】:2014-01-19 04:19:06 【问题描述】:我想对一小段 Java 代码有第二个意见。
下面的方法总是会返回一个等于输入字符串的输出字符串吗?
private static String func(final String url)
HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
con.setInstanceFollowRedirects(true);
...
...
return con.getURL().toString();
问题是指所有可能的场景,例如自动重定向等
【问题讨论】:
添加了 'con.setInstanceFollowRedirects(true)';答案仍然成立吗? 【参考方案1】:如果您查看URLConnection.getUrl() implementation,您可以看到它返回传递给构造函数的原始 URL。
HttpURLConnection 也不会改变原来的 url。
要获取重定向的目标 URL,您应该调用 con.getHeaderField("Location"); - 例如:Retrieve the final location of a given URL in Java
因此,在您调用 connect()
或其他导致建立连接的方法之前,您将获得原始 URL。
如果您设置了((HttpURLConnection)con).setInstanceFollowRedirects(true);
,那么在connect()
之后,如果它真的重定向,您将获得目标网址。
重定向可能不会自动发生,例如当协议更改时(例如 http -> https)。
【讨论】:
你确定吗?如果我调用 con.setInstanceFollowRedirects(true) 会怎样? 在这种情况下,在调用 connect() 或其他导致连接的方法之前,您将获得原始 URL。在 connect() with follow redirects true 之后,如果它真的遵循重定向,您将获得目标 URL(例如,如果协议更改:http -> https,则不会)。 所以基本上,你在这里说的意思是上面的答案是不正确的,对吧? 是的,现在也添加了另一种情况。顺便说一句,很难验证,因为 HttpURLConnection 只是一个抽象类,我猜实际实现是平台相关的......所以不同平台上的确切行为实际上可能不同......以上是关于URLConnection.getURL 方法的主要内容,如果未能解决你的问题,请参考以下文章