JDOM 使用提供给 SAXBuilder 的 URL 创建一个 URL 连接,并从该连接打开一个输入流以读取 XML 内容。
虽然我了解 HTTP 协议具有重定向功能,但这是由客户端处理的功能......请考虑一下:
# curl -i 'http://stackoverflow.com/questions/24913206'
HTTP/1.1 301 Moved Permanently
Cache-Control: public, no-cache="Set-Cookie", max-age=60
Content-Type: text/html; charset=utf-8
Expires: Wed, 23 Jul 2014 18:44:06 GMT
Last-Modified: Wed, 23 Jul 2014 18:43:06 GMT
Location: /questions/24913206/jdom2-follow-redirects-http-error-301
Vary: *
X-Frame-Options: SAMEORIGIN
Set-Cookie: prov=xxxx.yyyy.zzzz; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
Date: Wed, 23 Jul 2014 18:43:05 GMT
Content-Length: 174
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/questions/24913206/jdom2-follow-redirects-http-error-301">here</a>.</h2>
</body></html>
当 JDOM 从 URL 构建时将提供给 JDOM 的数据将http://stackoverflow.com/questions/24913206
是重定向 / HTTP-301 to http://stackoverflow.com/questions/24913206/jdom2-follow-redirects-http-error-301
,以及使人类可读的 HTML 内容。
现在,Java 的 URL 处理 API 只返回 JDOM 的输入流。您的建议是 JDOM 应该解释该流并自动重定向。
这有一些问题。
- JDOM 甚至不知道它是一个 HTTP URL。它通常是文件名或 FTP URL 等。
- 如果您不想遵循重定向怎么办?
- 等等
另一个问题是,这应该由 Java 原生支持,或者由应用程序主动支持。
真正的解决方案是什么:
- 使用以下命令告诉应用程序中的所有 HTTP 请求遵循重定向:
HTTPUrlConnection.setFollowRedirects(true)
不要给 JDOM 一个原始 URL 来构建,而是自己处理它:
URL httpurl = new URL(.....);
HTTPURLConnection conn = (HTTPUrlConnection)httpurl.openConnection();
conn.setInstanceFollowRedirects(true);
conn.connect();
Document doc = saxBuilder.build(conn.getInputStream());