Почему хеш-код java.net.URL разрешает хост IP? - PullRequest
8 голосов
/ 27 февраля 2010

Идея после первого разрешения будет опираться на кеширование ОС? Тем не менее, это кажется неэффективным, а в случаях, когда несколько доменов разрешают один и тот же IP, неверно Чего мне не хватает?

Ответы [ 4 ]

22 голосов
/ 28 февраля 2010

Почему хеш-код java.net.URL разрешает хосту IP-адрес?

Есть две причины. Первое:

  • Поведение класса URL было разработано для моделирования URL-адреса, являющегося локатором сетевого доступного ресурса. В частности, equals и hashCode() были разработаны так, чтобы два экземпляра URL были равны, если они находят один и тот же ресурс. Для этого необходимо, чтобы DNS-имя было преобразовано в IP-адрес.

Оглядываясь назад, мы знаем следующее:

  1. Метод URL.equals не может 1 надежно определить, являются ли две строки URL локаторами для одного и того же ресурса. Причины включают виртуальный хостинг, пересылку HTTP 30x и внутреннее сопоставление URL-адресов на сервере и т. Д.

  2. Поведение IP-разрешения URL.equals и URL.hashcode является ловушкой для неопытных Java-программистов, даже если оно четко задокументировано.

  3. Даже в тех случаях, когда это приводит к правильному ответу, разрешение IP на URL.equals может быть неожиданным (и нежелательным) ударом по производительности.

Короче ... этот аспект дизайна URL был ошибкой.

Это подводит нас ко второй, более важной причине.

  • Поведение URL.equals(Object) было определено долгое время назад, и было бы невозможно изменить сейчас, не нарушив (возможно) миллионы развернутых Java-приложений. Это исключает любую возможность того, что Sun (теперь Oracle) изменит его.

Возможно, разработчики (гипотетического) преемника библиотеки классов Java могли бы исправить это (и другие вещи). Конечно, для достижения этой цели обратная совместимость с существующими Java-программами должна быть выброшена из окна .

И, наконец, реальный ответ для разработчиков приложений на Java - просто использовать вместо этого класс URI. (Реальная разработка программного обеспечения заключается в том, чтобы выполнять работу как можно лучше, а не в том, чтобы жаловаться на инструменты, которые вам предоставили.)


1 - Когда я говорю «не могу» выше, я имею в виду, что это теоретически невозможно. Работа с некоторыми из более сложных случаев потребует изменений в протоколе HTTP. И даже если гипотетический HTTP 2.0 «исправит» проблему, мы все равно будем иметь дело с устаревшими серверами HTTP 1.1 через 20 лет ... и поэтому URL.equals все равно будет сломан.

7 голосов
/ 27 февраля 2010

Многие думают, что это очень плохая идея.

Вот некоторые пояснения из Javadoc URI . Этот вопрос также полезен.

4 голосов
/ 27 февраля 2010

Не используйте java.net.URL. Это простой ответ на ваш вопрос. Вместо этого используйте java.net.URI, что не будет разрешать имя хоста.

3 голосов
/ 27 февраля 2010

hashCode() тесно связано с equals(). Объяснение этого поведения описано в документах для equals() следующим образом:

Два хоста считаются эквивалентными, если оба имени хоста могут быть преобразованы в одинаковые IP-адреса; иначе, если либо имя хоста не может быть разрешено, хост имена должны быть равны безотносительно к дело; или оба имени хоста равны нуль.

Источник: java.net.URL.equals () Документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...