Почему сервер возвращает мне код ответа 403 для допустимого файла на Java?

#java #url #httpsurlconnection

#java #url #httpsurlconnection

Вопрос:

Я хочу получить Content Length этот файл с помощью Java:

 https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0amp;name=Q2FwdGFpbiBNYXJ2ZWwgRmFyc2lQZXJzaWFuIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGUgLSBTdWJmMm0gW3N1YmYybS5jb10uemlw
  

Когда я вставляю этот URL в Firefox или Google Chrome , он загружает файл. но когда я хочу увидеть размер этого файла по Java HttpsURlConnection , сервер возвращает мне Response Code 403 и Content Length -1 . почему это происходит? Спасибо

 try {
  System.out.println("program started -----------------------------------------");
  String str_url = "https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0amp;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
  

Комментарии:

1. Ну, 403 означает » запрещено «. Итак, очевидно, что-то в запросе, который вы делаете, означает, что сервер отказывается разрешить вам доступ к нему. Если вы посмотрите на код дополнительного состояния, он может предоставить больше информации.

2. Я только что попытался получить доступ к этому URL, и, похоже, происходит некоторая проверка браузера. Я предполагаю, что, возможно, существует какой-то процесс SSL или рукопожатия, который должен произойти, и это не происходит из вашего Java-кода.

Ответ №1:

Пользовательский агент Java по умолчанию заблокирован некоторыми онлайн-сервисами (в первую очередь, Cloudflare). Вам нужно установить User-Agent заголовок на что-то другое.

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

По моему опыту, не имеет значения, что вы для него установили, если это не значение по умолчанию:

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

РЕДАКТИРОВАТЬ: похоже, что этот сайт использует Cloudflare с активной защитой от DDoS — ваш код не будет запускать вызов JavaScript, необходимый для фактического получения содержимого файла.