首页 > 解决方案 > 为什么服务器向我返回 Java 中有效文件的响应代码 403?

问题描述

我想Content Length通过java获取这个文件:

https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0&name=Q2FwdGFpbiBNYXJ2ZWwgRmFyc2lQZXJzaWFuIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGUgLSBTdWJmMm0gW3N1YmYybS5jb10uemlw

Firefox当我在or中插入这个 url 时Google Chrome,它会下载一个文件。但是当我想查看该文件的大小时Java HttpsURlConnection,服务器返回我Response Code 403Content Length -1。为什么会这样?谢谢

try {
  System.out.println("program started -----------------------------------------");
  String str_url = "https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0&name=Q2FwdGFpbiBNYXJ2ZWwgRmFyc2lQZXJzaWFuIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGUgLSBTdWJmMm0gW3N1YmYybS5jb10uemlw";
  URL url = new URL(str_url);
  HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
  con.setConnectTimeout(150000);
  con.setReadTimeout(150000);
  con.setRequestMethod("HEAD");
  con.setInstanceFollowRedirects(false);
  con.setRequestProperty("Accept-Encoding", "identity");
  con.setRequestProperty("connection", "close");
  con.connect();

  System.out.println("responseCode:  " + con.getResponseCode());
  System.out.println("contentLength:  " + con.getContentLength());
} catch (IOException e) {
  System.out.println("error | " + e.toString());
  e.printStackTrace();
}

输出:

program started -----------------------------------------
responseCode:  403
contentLength:  -1

标签: javaurlhttpsurlconnection

解决方案


默认的 Java 用户代理被一些在线服务(最著名的是 Cloudflare)阻止。您需要将User-Agent标题设置为其他内容。

con.setRequestProperty("User-Agent", "My-User-Agent");

以我的经验,只要它不是默认值,您将其设置为什么都没有关系:

con.setRequestProperty("User-Agent", "aaa"); // works perfectly fine



编辑:看起来这个站点使用 Cloudflare 并激活了 DDoS 保护 - 您的代码不会运行实际获取文件内容所需的 JavaScript 质询。


推荐阅读