it-swarm.com.de

Wie prüfe ich nach einer gültigen URL in Java?

Wie prüfe ich am besten, ob eine URL in Java gültig ist? 

Wenn versucht wurde, new URL(urlString) aufzurufen und eine MalformedURLException abzufangen, scheint es jedoch mit allem zufrieden zu sein, das mit http:// beginnt.

Es geht mir nicht darum, eine Verbindung herzustellen, sondern nur um die Gültigkeit. Gibt es dafür eine Methode? Eine Anmerkung in Hibernate Validator? Soll ich einen Regex verwenden?

Edit: Einige Beispiele für akzeptierte URLs sind http://*** und http://my favorite site!.

80
Eric Wilson

Erwägen Sie die Verwendung der Apache Commons-Klasse UrlValidator

UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid("http://my favorite site!");

Es gibt verschiedene Eigenschaften, die Sie einstellen können, um das Verhalten dieser Klasse zu steuern. Standardmäßig werden http, https und ftp akzeptiert.

88
Tendayi Mawushe

Hier habe ich versucht und nützlich gefunden,

URL u = new URL(name); // this would check for the protocol
u.toURI(); // does the extra checking required for validation of URI 
52
Prasanna Pilla

Ich würde das gerne als Kommentar zu Tendayi Mawushes Antwort posten, aber ich fürchte, es gibt nicht genug Platz;

Dies ist der relevante Teil aus dem Apache Commons UrlValidator source :

/**
 * This expression derived/taken from the BNF for URI (RFC2396).
 */
private static final String URL_PATTERN =
        "/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/";
//         12            3  4          5       6   7        8 9

/**
 * Schema/Protocol (ie. http:, ftp:, file:, etc).
 */
private static final int PARSE_URL_SCHEME = 2;

/**
 * Includes hostname/ip and port number.
 */
private static final int PARSE_URL_AUTHORITY = 4;

private static final int PARSE_URL_PATH = 5;

private static final int PARSE_URL_QUERY = 7;

private static final int PARSE_URL_FRAGMENT = 9;

Dort können Sie leicht einen eigenen Validator erstellen.

6

Mein Lieblingsansatz ohne externe Bibliotheken:

try {
    URI uri = new URI(name);

    // perform checks for scheme, authority, Host, etc., based on your requirements

    if ("mailto".equals(uri.getScheme()) {/*Code*/}
    if (uri.getHost() == null) {/*Code*/}

} catch (URISyntaxException e) {
}
4
Andrei Volgin

Anhand des Quellcodes für URI kann die

public URL(URL context, String spec, URLStreamHandler handler)

konstruktor führt mehr Validierung durch als die anderen Konstruktoren. Sie könnten es versuchen, aber YMMV.

3
uckelman

validatorpaket:

Es scheint ein Nice-Paket von Yonatan Matalon namens UrlUtil zu geben. Zitieren seiner API:

isValidWebPageAddress(Java.lang.String address, boolean validateSyntax, 
                      boolean validateExistance) 
Checks if the given address is a valid web page address.

Suns Ansatz - Überprüfen Sie die Netzwerkadresse

Die Java-Site von Sun bietet Verbindungsversuch als Lösung zum Überprüfen von URLs.

Andere Regex-Codeausschnitte:

Es gibt Regex-Validierungsversuche auf der Site von Oracle und weberdev.com .

3
Adam Matan

Ich mochte keine der Implementierungen (weil sie eine Regex verwenden, die eine teure Operation ist, oder eine Bibliothek, die ein Overkill ist, wenn Sie nur eine Methode benötigen), also habe ich die Java.net.URI-Klasse mit einigen verwendet zusätzliche Prüfungen und Beschränkung der Protokolle auf: http, https, file, ftp, mailto, news, urne.

Und ja, Ausnahmen abzufangen kann eine teure Operation sein, aber wahrscheinlich nicht so schlimm wie reguläre Ausdrücke:

final static Set<String> protocols, protocolsWithHost;

static {
  protocolsWithHost = new HashSet<String>( 
      Arrays.asList( new String[]{ "file", "ftp", "http", "https" } ) 
  );
  protocols = new HashSet<String>( 
      Arrays.asList( new String[]{ "mailto", "news", "urn" } ) 
  );
  protocols.addAll(protocolsWithHost);
}

public static boolean isURI(String str) {
  int colon = str.indexOf(':');
  if (colon < 3)                      return false;

  String proto = str.substring(0, colon).toLowerCase();
  if (!protocols.contains(proto))     return false;

  try {
    URI uri = new URI(str);
    if (protocolsWithHost.contains(proto)) {
      if (uri.getHost() == null)      return false;

      String path = uri.getPath();
      if (path != null) {
        for (int i=path.length()-1; i >= 0; i--) {
          if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
            return false;
        }
      }
    }

    return true;
  } catch ( Exception ex ) {}

  return false;
}
2
isapir

Die "narrensicherste" Methode ist die Überprüfung der Verfügbarkeit der URL. Zum Beispiel:

public boolean isURL(String url) {
  try {
     (new Java.net.URL(url)).openStream().close();
     return true;
  } catch (Exception ex) { }
  return false;
}
0
Voodoo