Java HTTP getResponseCode возвращает 200 для несуществующего URL

#java #networking

#java #сеть

Вопрос:

Я ожидал, что этот код вернет 404, однако он выдает вывод :

«Код ответа равен 200»

Можно ли узнать, как различать существующие и несуществующие веб-страницы . . . большое спасибо,

     try
    {
    // create the HttpURLConnection
    URL url = new URL("http://www.thisurldoesnotexist");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    System.out.println("Response code is "   connection.getResponseCode());
    }
  

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

1. Если вы получили обратно 200, значит, страница действительно существует…

2. попробуйте http://www.fackurl.com и посмотрите, что вы получите, вероятно, вы получите исключение

Ответ №1:

РЕДАКТИРОВАТЬ: я вижу, что вы позвонили, openConnection() но не connect() — может ли это быть проблемой? Я бы ожидал getResponseCode() , что запрос действительно будет выполнен, если он еще не выполнен, но стоит просто попробовать это…


Это говорит о том, что у вас, возможно, есть какой-то DNS-распознаватель, который перенаправляет на страницу «помощника» (спама) или что-то в этом роде.

Самый простой способ точно увидеть, что здесь происходит, — это использовать Wireshark — настроить его и перехватывать трафик (только HTTP, чтобы упростить жизнь), а затем запустить свой код. Вы должны быть в состоянии увидеть, что происходит таким образом.

Обратите внимание, что я бы не ожидал 404 — потому что это потребовало бы возможности найти веб-сервер, с которым можно связаться для начала. Если вы пытаетесь перейти к хосту, который не задействован, ответа HTTP не должно быть вообще. Я бы ожидал, connect() что он выдаст исключение.

Ответ №2:

попробуйте добавить «connection.connect();» или посмотрите на возвращаемое содержимое…

это может быть проблема с dns, т. Е. ваш dns отправляется на место парковки… например: freedns делает это.

Ответ №3:

Вы могли бы:

  1. Разрешите IP-адрес от хоста страницы
  2. Попробуйте подключиться к порту 80 на разрешенном IP-адресе, используя обычные сокеты

Однако это немного низкий уровень и добавит сложности, поскольку вам нужно будет выполнить простой GET-запрос через сокет. Затем проверьте ответ, чтобы убедиться, что это действительно HTTP-сервер, работающий на порту 80.

Здесь вам может помочьNMap.

Ответ №4:

В идеале вы должны получать эту ошибку:

 java.net.UnknownHostException: www.thisurldoesnotexist
  

Но похоже, что ваш URL разрешен вашим DNS-провайдером.

Например, в сети моей компании выполняется ваш код с URI «http://profile /» отображает профиль сотрудника.

Пожалуйста, также проверьте файл etc.home, если вы используете Windows, чтобы проверить, были ли изменены какие-либо настройки.

Ответ №5:

Как @spgennard — я думаю, что это, скорее всего, проблема с DNS.

  • Выбранный вами URL-адрес принадлежит спекулянту DNS.
  • Выбранный вами URL-адрес «припаркован» поставщиком DNS.
  • Ваш провайдер изменяет результаты вашего DNS, чтобы отправить ваш браузер на какую-либо страницу поиска.

Также возможно, что вы получаете доступ к Сети через прокси-сервер, и прокси-сервер делает что-то странное.

Способ диагностировать это — посмотреть на другую информацию в получаемых вами HTTP-ответах, особенно в теле ответа.