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

如何修复java.io.IOException:服务器返回HTTP响应代码:403,java,xml,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(); DocumentBuil

使用这段代码,目前我正在阅读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的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)


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

我只需要设置用户代理

    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();

我只需要设置用户代理

    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();

在此处添加更多信息,以防对其他人有所帮助

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

我发现的一个当前的例子是

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

假设您正在解析XML,则可以按照@zsbapa建议的代码进行操作:

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
。它通常看起来像这样:

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
作为
转换
命令行(
-er:classname
)上的选项或作为Saxon
配置
上的选项提供给Saxon。例如:

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

在此处添加更多信息,以防对其他人有所帮助

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

我发现的一个当前的例子是

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

假设您正在解析XML,则可以按照@zsbapa建议的代码进行操作:

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
。它通常看起来像这样:

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
作为
转换
命令行(
-er:classname
)上的选项或作为Saxon
配置
上的选项提供给Saxon。例如:

transformerFactory.setAttribute(
  FeatureKeys.ENTITY_RESOLVER_CLASS, MyEntityResolver.class);
Wikipedia:Error 403:“服务器理解请求,但拒绝完成请求。授权没有帮助,请求不应重复。”查看并处理请求头,可能设置
用户代理
头。Wikipedia:Error 403:“服务器理解该请求,但拒绝满足该请求。授权不会有帮助,请求不应重复。“查看并玩转请求标题,在我的情况下,可能设置
用户代理
header.iteresting,但它的工作!)如果我从ide运行,工作正常,从cmd运行有错误,但工作正常!)在我的情况下,如果我从ide运行,工作正常,从cmd运行有错误