首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复java.io.IOException:服务器返回的HTTP响应代码: 403

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

Stack Overflow用户
提问于 2018-08-09 09:36:46
回答 2查看 9.4K关注 0票数 0

使用此代码,我正在读取xml文件,并且它在我的个人Ubuntu PC上运行良好。

代码语言:javascript
运行
复制
   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服务器上运行相同的代码时,会出现错误。

服务器返回HTTP响应代码: 403用于URL: sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263) https://www.google.com/sitemap.xml

有人能帮我找出这个问题吗?服务器中的问题在哪里?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-10 05:23:34

我只需要设置用户代理

代码语言:javascript
运行
复制
    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();
票数 2
EN

Stack Overflow用户

发布于 2018-09-07 14:15:49

在这里添加更多信息,以防对其他人有所帮助。

首先,在其他答案中给出的基本技术是正确的:当您从试图访问HTTP资源的Java程序(例如XML解析器)获得HTTP 403错误时,但是在web浏览器中键入相同的URI是成功的,那么您可能需要设置使站点误以为请求来自浏览器的请求头。

我发现目前正在发生这种情况的一个例子是https://www.musicxml.org/xsd/xml.xsd的模式

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

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

代码语言:javascript
运行
复制
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());

但是,如果您通过XSLT处理器(如Saxon )读取该文件,或者该文件包含对XML解析器也需要读取的其他文件的引用(例如DTD、外部实体或模式文档),那么它就不那么容易了。在这种情况下,您需要做的是在解析器上配置一个EntityResolver。它通常如下所示:

代码语言:javascript
运行
复制
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作为Transform命令行(-er:classname)上的选项或Saxon Configuration上的选项提供给Saxon。例如:

代码语言:javascript
运行
复制
transformerFactory.setAttribute(
  FeatureKeys.ENTITY_RESOLVER_CLASS, MyEntityResolver.class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51763610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档