如何修复java.io.IOException:服务器返回的HTTP响应代码:403

时间:2018-08-09 09:36:46

标签: java xml

当前使用此代码,我正在读取xml文件,并且可以在我的个人Ubuntu PC上正常工作

   URL url = new URL("https://www.google.com/site-map-all.xml");
    InputStream inputFile = url.openStream();
    DocumentBuilderFactory dbFactory = 
    DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(inputFile);
    doc.getDocumentElement().normalize();

但是当我在Ubuntu服务器中运行相同的代码时显示错误

  

java.io.IOException:服务器针对URL:https://www.google.com/sitemap.xml返回了HTTP响应代码:403       在sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)       在sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)       在sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)

有人可以帮我找出问题吗?服务器的问题在哪里?

2 个答案:

答案 0 :(得分:0)

我只需要设置用户代理

    URL url = new URL("https://www.google.com/sitemap.xml");
    URLConnection urlc = url.openConnection();
    urlc.setRequestProperty("User-Agent", "Mozilla 5.0 (Windows; U; "
            + "Windows NT 5.1; en-US; rv:1.8.0.11) ");
    InputStream inputFile = urlc.getInputStream();

答案 1 :(得分:0)

在此处添加一些其他信息以防其他人使用。

首先,其他答案中给出的基本技术是正确的:当您从尝试访问HTTP资源的Java程序(例如XML解析器)中收到HTTP 403错误时,却在您的网络中键入了相同的URI浏览器成功运行,那么您可能需要设置请求标头,以使网站误认为该请求来自浏览器。

我发现一个当前的例子是https://www.musicxml.org/xsd/xml.xsd

如果只需要一个文件,并且正在直接调用该文件的解析器,则可以“手动”创建一个InputSource并将其传递给XML解析器

假设您正在执行XML解析,则可以遵循@zsbappa建议的代码:

URLConnection connection = new URL(uriString).openConnection();
connection.setRequestProperty("User-Agent", 
   "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
connection.connect();
InputSource inputSource = new InputSource(connection.getInputStream());

但是,如果您通过诸如Saxon之类的XSLT处理器读取文件,或者该文件包含XML解析器也需要读取的其他文件的引用(例如DTD,外部实体或模式文档),则它是不太容易。在这种情况下,您需要做的是在解析器上配置EntityResolver。通常看起来像这样:

xmlReader.setEntityResolver((publicId, systemId) -> {
  if (systemId.startsWith("http:")) {
    URLConnection connection = new URL(systemId).openConnection();
    connection.setRequestProperty("User-Agent", 
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
    connection.connect();
    return new InputSource(connection.getInputStream());
  } else {
    return null;
  }
});

如果您正在调用Saxon,而Saxon正在调用XML解析器,则可以将EntityResolver提供给Saxon作为Transform命令行(-er:classname)上的选项,也可以撒克逊Configuration上的一个选项。例如:

transformerFactory.setAttribute(
  FeatureKeys.ENTITY_RESOLVER_CLASS, MyEntityResolver.class);