Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus

Blut1Bart

Bekanntes Mitglied
Du verwechselst da glaube ich etwas.

A) URL ist nicht für die Sicherheit der URLs zuständig. Wenn du eine Integritäts- und Validitätsprüfung brauchst, solltest du andere Libs verwenden. Zudem kannst du ne String-Map verwenden, wenn du unsichere Strings speichern möchtest, edit: und lazy initialisation betreiben möchtest.

B) Das Problem besteht auf Seiten von JavaScript und Co. ;) Java kann dafür relativ wenig...
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Du verwechselst da glaube ich etwas.

A) URL ist nicht für die Sicherheit der URLs zuständig. Wenn du eine Integritäts- und Validitätsprüfung brauchst, solltest du andere Libs verwenden. Zudem kannst du ne String-Map verwenden, wenn du unsichere Strings speichern möchtest, edit: und lazy initialisation betreiben möchtest.

B) Das Problem besteht auf Seiten von JavaScript und Co. ;) Java kann dafür relativ wenig...
Nein, wenn du auf einer java.net.Url Klasse die hashCode Methode aufrufst, wird ein DNS Lookup gemacht.

Beispiel:
Java:
package de.limdul.javaforum;

import java.net.MalformedURLException;
import java.net.URL;

public class TestLookup {

    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost");
        URL url2 = new URL("http://127.0.01");
        System.out.println(url.hashCode());
        System.out.println(url2.hashCode());

        url = new URL("http://www.spiegel.de");
        url2 = new URL("http://128.65.210.183");
        System.out.println(url.hashCode());
        System.out.println(url2.hashCode());
        System.out.println(url.equals(url2));
    }
}
Ausgabe:
2133919961
2133919961
-2139956337
-2139956337
true
Kann man auch schön im Source Code des JDK sehen - hashCode macht einen DNS Request...
 

LimDul

Top Contributor
Weiterer Proof:
Java:
package de.limdul.javaforum;

import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;

public class TestLookup2 {

	public static void main(String[] args) throws MalformedURLException {
		URL url = new URL("http://sgihlsghisghkskhljgshklgshlkgslkghskgs");
		System.out.println(LocalDateTime.now());
		url.hashCode();
		System.out.println(LocalDateTime.now());
	}
}
Ausgabe:
2021-12-13T22:01:15.931666400
2021-12-13T22:01:16.957617700
1 Sekunde Laufzeit für hashCode();

Ich hab einen eigenen DNS (pihole) im Netzwerk, schauen wir mal in die Logs:
 

Anhänge

  • pihole.PNG
    pihole.PNG
    53,3 KB · Aufrufe: 1

Blut1Bart

Bekanntes Mitglied
URL steht für Uniform Resource Locator, diese kann vielgestaltig sein... ich sehe da keine Kontraktsverletzung. Eine IP ist eindeutig...

edit: Diese muss eindeutig sein, meinte ich
 

LimDul

Top Contributor
Zwei Objekte, wo equals true liefert müssen den gleichen hashcode haben. Das ist hier nicht garantiert, da der hashcode von der IP des hosts abhängig ist. Und Zu einem host kann es beliebig viele ips geben
 
K

kneitzel

Gast
Die Verletzung des Kontrakts ist relativ einfach aufzuzeigen:

Du nimmst einen DNS Namen, den du ändern kannst. Machst eine URL damit, nimmst den HashCode. Dann passt du die IP an, machst erneut eine URL mit gleichem Wert und erstellst erneut den Hashcode:

Nun solltest du für die gleiche URL zwei unterschiedliche Hashcodes haben.
 

Blut1Bart

Bekanntes Mitglied
Ich habe dir Alternativen aufgezeigt.

Zwei Objekte, wo equals true liefert müssen den gleichen hashcode haben. Das ist hier nicht garantiert, da der hashcode von der IP des hosts abhängig ist. Und Zu einem host kann es beliebig viele ips geben
Doch das ist garantiert, dass equals und hashCode übereinstimmen, dafür sind IPs da.
 

X5-599

Top Contributor
Die Verletzung des Kontrakts ist relativ einfach aufzuzeigen:

Du nimmst einen DNS Namen, den du ändern kannst. Machst eine URL damit, nimmst den HashCode. Dann passt du die IP an, machst erneut eine URL mit gleichem Wert und erstellst erneut den Hashcode:

Nun solltest du für die gleiche URL zwei unterschiedliche Hashcodes haben.

So wie ich das verstehe sollte dann die URL ebenfalls nicht mehr als gleich angesehen werden, da in equals ebenfalls Nameresolution betrieben wird.
 
K

kneitzel

Gast
So wie ich das verstehe sollte dann die URL ebenfalls nicht mehr als gleich angesehen werden, da in equals ebenfalls Nameresolution betrieben wird.
Das ist aber nicht Part der URL! Aber das ist halt etwas, das die Entwickler so sehen wie Du (Unabhängig davon, ob ich dem folgen kann oder nicht).

Class URL represents a Uniform Resource Locator, a pointer to a "resource" on the World Wide Web.
Und da wird dann dieser Pointer auch beschrieben incl. dem Host. Und das ist da dann einfach ein Part des Strings.

Equals schreibst dann zwar auch:
Two hosts are considered equivalent if both host names can be resolved into the same IP addresses; else if either host name can't be resolved, the host names must be equal without regard to case; or both host names equal to null.

Since hosts comparison requires name resolution, this operation is a blocking operation.

Note: The defined behavior for equals is known to be inconsistent with virtual hosting in HTTP.
Aber dem kann ich nicht folgen! Die IP Adresse ist aus meiner Sicht eine andere Abstraktionsebene, die bei dem Vergleich nicht wirklich sinnvoll ist.
(Und die IP ist einfach uninteressant! Diese Abstraktionsebene ist ja eben eingeführt wurden, um hier eine Unabhängigkeit zu schaffen! Zu Cloud Zeiten noch viel mehr als früher! Es gibt dynamische Prozesse die ggf. mehr oder weniger Ressourcen zuordnen. Das mag alles gehen, so alles hinter LoadBalancern steckt oder hinter einer "virtuellen" IP, aber dem muss ja nicht so sein! Reicht ja schon, dass ich auf einer kleinen Hand voll Servern Dinge verschiebe von einem Server zu einem anderen. Du bist abhängig von Dingen außerhalb - das ist zumindest nicht mein Verständnis vom equals.

Mein Hauptkritikpunkt ist hier:
a) Es ist einfach überkompliziert. und in meinen Augen nicht intuitiv. (Oder ist das ein erwartetes Verhalten?)
b) Probleme bei der Nutzung: HashCode / equals abhängig von der IP, die außerhalb des Systems liegt. Du speicherst also eine URL als Key in einer HashMap und wirst diese dann nicht mehr aufrufen können, so sich bei der IP etwas geändert haben sollte. (hashCode wird wohl gecached - aber das löst nicht wirklich die Probleme!)
c) Mögliche Probleme bei der Implementation, die dann in Spezialfällen zu Verstößen gegen den Contract führen (Je nach Caching kann man sowas entwerfen. Aber ich revidiere mein Urteil etwas, denn das ist dann kein Verstoß gegen den Kontrakt der durch den Ansatz kommt sondern eben durch einen "Fehler" in der Implementation kommt.)

Also ich bin hier ehrlich gesagt extrem überrascht und kann die Beweggründe hier gerade nicht nachvollziehen.

Ich hatte auch einmal im .Net Bereich geschaut und da ist sowas nicht der Fall. Da läuft es aber auch über die Klasse Uri.
 

Blut1Bart

Bekanntes Mitglied
Ich weiß nicht wo das Problem ist... Wenn ich ein Pferd kaufen möchte, so erwarte ich ein Pferd. Wenn ich einen Esel kaufen möchte, so erwarte ich einen Esel...
 

httpdigest

Top Contributor
Es ist bereits allgemein und landläufig bekannt, dass java.net.URL completely broken ist, da das Ergebnis von hashCode() und equals() eben - wie genannt - von I/O abhängt und z.B. unterschiedliche Ergebnisse liefert, wenn dein Rechner gerade Internetzugriff hat oder nicht.
Die Empfehlung ist hier schon lange, nicht java.net.URL, sondern java.net.URI zu nehmen, welches dieses Problem nicht hat.
 

httpdigest

Top Contributor
Stimmt. Aber das ist dann vermutlich bei fast jedem Problem die Ursache. :)
Das eigentliche Problem ist aber Intuition bzw. die extreme Verletzung des "Principle of least astonishment".
Das Verhalten von java.net.URL _erwartet_ man halt einfach nicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
Developer_X Mit einer Batch Datei eine Java Datei starten Allgemeine Java-Themen 4
N Aus einer Kompilierten Javadatei eine *.java erzeugen Allgemeine Java-Themen 2
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
Thallius Wie mache ich eine Java App mit Icon startbar die mehr Heap Speicher braucht? Allgemeine Java-Themen 3
H Eine .java-Datei aus der Windowskommandozeile komplilieren - wie? Allgemeine Java-Themen 7
S "Katalog"-Anwendung in Java eine gute Idee? Allgemeine Java-Themen 12
X Java findet eine Enum Klasse nicht Allgemeine Java-Themen 2
G Java PrintFramework druckt nur eine Seite Allgemeine Java-Themen 2
J Java-Datei unter Mac OS X öffnen - eine Frage der Klasse Allgemeine Java-Themen 2
M Java lernen, ist das eine gute Möglichkeit? Allgemeine Java-Themen 5
J Eine kleine Aufnahme mit Java Allgemeine Java-Themen 3
E Eine .wsp datei in java öffnen auslesen und verändern Allgemeine Java-Themen 4
G GUIs mit Java - Eine Katastrophe! Allgemeine Java-Themen 19
P Java eine Insel und Kaffee ? Allgemeine Java-Themen 6
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
D Lostus Notes Adressbuch in eine Java-Webanwendung verwenden Allgemeine Java-Themen 4
P Verdienst eine Java- Programmieres Allgemeine Java-Themen 21
M Eine Frage über Unit-Tests mit Java Allgemeine Java-Themen 2
H aus .class datei eine .java erzeugen Allgemeine Java-Themen 4
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
G Da Jikes nicht mit java 5 geht, gibt es eine andere. Allgemeine Java-Themen 4
G Eine Frage zu Java Allgemeine Java-Themen 15
1 Eine Flash-Seite auch in Java realisierbar ? Allgemeine Java-Themen 2
C Mit Java auf eine HTML-Seite zugreifen Allgemeine Java-Themen 3
B Java ist auch eine Insel Allgemeine Java-Themen 10
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24

Ähnliche Java Themen

Neue Themen


Oben