Java'da geçerli bir URL nasıl kontrol edilir?


97

Java'da bir URL'nin geçerli olup olmadığını kontrol etmenin en iyi yolu nedir?

Aramaya new URL(urlString)ve yakalamaya çalışırsanızMalformedURLException , ancak ile başlayan her şeyden memnun görünüyor http://.

Bir bağlantı kurmakla ilgilenmiyorum, sadece geçerlilik. Bunun için bir yöntem var mı? Hibernate Validator'da bir ek açıklama mı? Normal ifade kullanmalı mıyım?

Düzenleme: Kabul edilen URL'lere bazı örnekler http://***ve http://my favorite site!.


Bir bağlantı kurmayacaksanız geçerliliği nasıl tanımlarsınız?
Michael Myers

2
Kurucunun URLkabul ettiği geçerli bir URL olmayan bir şeye örnek verebilir misiniz ?
uckelman

1
@mmyers: Geçerlilik, bir URL'nin ne olduğunu tanımlayan 2396 ve 2732 RFC'ler tarafından belirlenmelidir.
uckelman

4
@uckelman: Hemen hemen her şey. " http://***" çalışır. " http://my favorite site!" çalışır. Bir istisna atmasını sağlayamıyorum (http: // başlangıçta iken)
Eric Wilson

Yanıtlar:


103

Apache Commons UrlValidator sınıfını kullanmayı düşünün

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

Bu sınıf davranacağını, varsayılan olarak nasıl kontrol ayarlayabilirsiniz birkaç özellik vardır http, httpsve ftpkabul edilir.


7
.london vb. gibi daha yeni alan adlarıyla çalışmıyor gibi görünüyor
VH

intranet url'leri nasıl olur?
Puneet

Alt çizgili url'leri doğrulamaz.
Udit Kumawat

Yeni TLD'ler ve yerel alan adları, örn. local, Vb.

UrlValidator'ın garip intranet üst düzey etki alanımızla çalışmasını sağlayamadım. .Com, .org gibi yaygın olanlar ve bu tür işler. Bu konu için bir RegExp oluşturmakla ilgilenmiyorum, bu yüzden new URL(name).toURI()çözüm olur.
Avec

61

İşte denediğim ve faydalı bulduğum yol,

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

1
İyi bir. Yalnızca yeni URL (ad) kullanmak neredeyse her şeyi kabul eder. Url.toURI (); tam olarak geliştiricinin aradığı şeydir - diğer kitaplıkları / çerçeveleri kullanmadan!
justastefan

2
Bu, http: /google.com gibi hatalı biçimlendirilmiş URL'ler için de işe yaramayacaktır. Apache Commons'tan UrlValidator kullandım.
starf

1
Bu gerçekten tehlikeli. Bu örnekte birçok başka makale olduğunu görüyorum. URL u = new URL(http://google).toURI();bir istisna oluşturmayacak.
Sonu Oommen

1
@SonuOommen belki new URL(http://google)de geçerli olduğu için ^^ şirketimde bunun gibi çok sayıda dahili alan
adımız var

8

Bunu Tendayi Mawushe'nin cevabına bir yorum olarak göndermeyi çok isterim , ama korkarım yeterli alan yok;)

Bu, Apache Commons UrlValidator kaynağından ilgili kısımdır :

/**
 * 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;

Buradan kendi doğrulayıcınızı kolayca oluşturabilirsiniz.


6

En "kusursuz" yol, URL'nin kullanılabilirliğini kontrol etmektir:

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

5

Harici kitaplıklar olmadan en sevdiğim yaklaşım:

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) {
}

3

Kaynak koduna bakılırsa URI,

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

yapıcı, diğer kuruculardan daha fazla doğrulama yapar. Bunu deneyebilirsin ama YMMV.


3

Uygulamalardan hiçbirini beğenmedim (çünkü pahalı bir işlem olan bir Regex veya sadece bir yönteme ihtiyacınız varsa aşırı bir kitaplık kullanıyorlar), bu yüzden java.net.URI sınıfını bazılarıyla kullandım. ek kontroller ve protokolleri şu şekilde sınırlandırır: http, https, file, ftp, mailto, news, urn.

Ve evet, istisnaları yakalamak pahalı bir işlem olabilir, ancak muhtemelen Normal İfadeler kadar kötü değildir:

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

doğrulayıcı paketi:

Yonatan Matalon'dan UrlUtil adlı güzel bir paket var gibi görünüyor . API'sinden alıntı yapmak:

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

Sun'ın yaklaşımı - ağ adresini kontrol edin

Sun'ın Java sitesi bir çözüm olarak bağlanma girişimi sunuyor URL'leri doğrulamak için .

Diğer normal ifade kod parçacıkları:

Oracle sitesinde ve weberdev.com'da düzenli ifade doğrulama girişimleri var .


1
Bu kod, farklı bir sorun olan bağlantıları kontrol etmek içindir. Bu soru URL'nin geçerliliğiyle ilgilidir, ona bir bağlantı kurulup kurulamayacağıyla değil.
Michael Myers

Bu örnek, URL'nin iyi biçimlendirilmiş olup olmadığını değil, mevcut olup olmadığını kontrol etmekle ilgilidir.
uckelman

Kabul edildi, diğer yaklaşımlar eklendi.
Adam Matan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.