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

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

8
задан Michael Easter 28 February 2010 в 00:36
поделиться

4 ответа

Многие люди считают, что это была очень плохая идея.

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

7
ответ дан 5 December 2019 в 04:55
поделиться

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

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

  • Поведение класса URL было разработано для моделирования URL, являющегося указателем доступного в сети ресурса. В частности, равно и 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 все равно будет неработоспособным.

24
ответ дан 5 December 2019 в 04:55
поделиться

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

4
ответ дан 5 December 2019 в 04:55
поделиться

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

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

Источник: java.net.URL.equals () docs.

3
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: