JDOM2 - 关注重定向(HTTP错误301)

时间:2014-07-23 14:27:00

标签: java xml http redirect jdom-2

我目前正在使用其公共XML API为网站开发第三方程序。我不想深入讨论该计划实际在做什么或者什么,因为一开始似乎有问题。该网站的API期望客户端遵循重定向并设置适当的用户代理来验证应用程序本身,但我用于此项目的JDOM2库似乎没有做任何这些事情。包中集成的SAXBuilder(org.jdom2.input)和本机HTTPURLConnection(java.net)类似乎都没有正常工作。

我很困惑,不知道从哪里开始。有没有办法让JDOM2库遵循重定向,或者我只是缺少一个简单的方法调用?

1 个答案:

答案 0 :(得分:1)

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>

从URL http://stackoverflow.com/questions/24913206构建时将提供给JDOM的数据将是重定向/ HTTP-301到http://stackoverflow.com/questions/24913206/jdom2-follow-redirects-http-error-301,以及使人类可读的HTML内容。

现在,Java的URL处理API只返回JDOM的输入流。你的建议是JDOM应该解释那个流,并自动重定向。

这有一些问题。

  • JDOM甚至不知道它是HTTP URL。它通常是文件名或FTP URL等。
  • 如果您不想关注重定向怎么办?

另一个问题是,这应该由Java本地支持,或者由应用程序主动支持。

真正的解决方案是什么:

  1. 使用以下命令告知应用程序中的所有HTTP请求:HTTPUrlConnection.setFollowRedirects(true)
  2. 不要为JDOM提供构建的原始URL,而是自己处理:

    URL httpurl = new URL(.....);
    HTTPURLConnection conn = (HTTPUrlConnection)httpurl.openConnection();
    conn.setInstanceFollowRedirects(true);
    conn.connect();
    Document doc = saxBuilder.build(conn.getInputStream());