Si vous souhaitez analyser une URL, utilisez java.net.URI
. java.net.URL
a un tas de problèmes - sa equals
méthode effectue une recherche DNS, ce qui signifie que le code qui l'utilise peut être vulnérable aux attaques par déni de service lorsqu'il est utilisé avec des entrées non fiables.
"M. Gosling - pourquoi avez-vous fait que l'URL est nul?" explique un de ces problèmes. Prenez simplement l'habitude d'utiliser à la java.net.URI
place.
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
devrait faire ce que vous voulez.
Bien que cela semble fonctionner correctement, existe-t-il une meilleure approche ou existe-t-il des cas extrêmes qui pourraient échouer.
Votre code tel qu'il est écrit échoue pour les URL valides:
httpfoo/bar
- URL relative avec un composant de chemin commençant par http
.
HTTP://example.com/
- le protocole est insensible à la casse.
//example.com/
- URL relative du protocole avec un hôte
www/foo
- une URL relative avec un composant de chemin commençant par www
wwwexample.com
- nom de domaine qui ne commence pas par www.
mais commence par www
.
Les URL hiérarchiques ont une grammaire complexe. Si vous essayez de lancer votre propre analyseur sans lire attentivement la RFC 3986, vous vous tromperez probablement. Utilisez simplement celui qui est intégré aux bibliothèques principales.
Si vous avez vraiment besoin de gérer des entrées désordonnées qui java.net.URI
rejettent, consultez RFC 3986, annexe B:
Annexe B.Analyse d'une référence URI avec une expression régulière
Comme l'algorithme "first-match-wins" est identique à la méthode de désambiguïsation "gourmande" utilisée par les expressions régulières POSIX, il est naturel et courant d'utiliser une expression régulière pour analyser les cinq composants potentiels d'une référence URI.
La ligne suivante est l'expression régulière pour décomposer une référence URI bien formée en ses composants.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Les chiffres de la deuxième ligne ci-dessus ne servent qu'à faciliter la lecture; ils indiquent les points de référence pour chaque sous-expression (c.-à-d. chaque parenthèse appariée).
http://74.125.226.70
me faire savoir comment cela fonctionne :)