Как проверить действительный URL-адрес в Java?

Каков наилучший способ проверить, действителен ли URL на Java?

Если попытался вызвать new URL(urlString) и поймать MalformedURLException , но он, похоже, доволен тем, что начинается с http:// .

Меня не интересует установление соединения, просто действительность. Есть ли способ для этого? Аннотации в Hibernate Validator? Должен ли я использовать регулярное выражение?

Изменить: некоторые примеры принятых URL-адресов: http://*** и http://my favorite site! ,

Рассмотрите возможность использования classа AplValator для Apache

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

Существует несколько свойств, которые вы можете настроить для управления тем, как ведет себя этот class, по умолчанию принимаются http , https и ftp .

Вот как я пытался и нашел полезным,

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

Я бы хотел опубликовать это как комментарий к ответу Тендайи Мауше , но я боюсь, что не хватает места;)

Это важная часть из источника Apache Commons UrlValidator:

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

Оттуда вы можете легко создать свой собственный валидатор.

Мой любимый подход, без внешних библиотек:

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

пакет проверки подлинности:

Кажется, хороший пакет Yonatan Matalon назвал UrlUtil . Цитируя свой API:

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

Подход Sun – проверьте сетевой адрес

Sun Java-сайт предлагает попытку подключения в качестве решения для проверки URL-адресов.

Другие fragmentы кода регулярного выражения:

На сайте Oracle и веб- сайтах weberdev.com есть попытки проверки регулярных выражений.

Судя по исходному коду для URI ,

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

конструктор делает большую проверку, чем другие конструкторы. Вы можете попробовать это, но YMMV.

Мне не понравилась ни одна из реализаций (потому что они используют Regex, которая является дорогостоящей операцией, или библиотека, которая является излишней, если вам нужен только один метод), поэтому я закончил использование classа java.net.URI с некоторыми дополнительные проверки и ограничение протоколов: http, https, file, ftp, mailto, news, urn.

И да, перехватывание исключений может быть дорогостоящей операцией, но, вероятно, не так плохо, как регулярные выражения:

 final static Set protocols, protocolsWithHost; static { protocolsWithHost = new HashSet( Arrays.asList( new String[]{ "file", "ftp", "http", "https" } ) ); protocols = new HashSet( 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; } 
  • Подтверждение платформы Entity Framework с частичными обновлениями
  • Проверка синтаксиса XML в Java
  • Тестирование указателей на достоверность (C / C ++)
  • Концепция концепции проверки Struts 2
  • Давайте будем гением компьютера.