Как лучше всего проверить, действителен ли URL-адрес в Java?
Если пытался позвонить new URL(urlString)
и поймать MalformedURLException
, но вроде бы доволен всем, с чего начинается http://
.
Меня не беспокоит установление связи, только действительность. Есть ли способ для этого? Аннотации в Hibernate Validator? Стоит ли использовать регулярное выражение?
Изменить: некоторые примеры принятых URL-адресов: http://***
и http://my favorite site!
.
java
validation
url
Эрик Уилсон
источник
источник
URL
принимает конструктор?http://***
" работает. "http://my favorite site!
" работает. Я не могу заставить его генерировать исключение (когда http: // находится в начале.)Ответы:
Рассмотрите возможность использования класса Apache Commons UrlValidator
UrlValidator urlValidator = new UrlValidator(); urlValidator.isValid("http://my favorite site!");
Есть несколько свойств , которые вы можете установить для контроля , как этот класс ведет себя, по умолчанию
http
,https
иftp
принимаются.источник
local
, и т. Д.new URL(name).toURI()
стал решением.Вот способ, который я пробовал и нашел полезным:
URL u = new URL(name); // this would check for the protocol u.toURI(); // does the extra checking required for validation of URI
источник
URL u = new URL(http://google).toURI();
не вызовет исключения.new URL(http://google)
он действителен ^^ у нас в компании много таких внутренних доменовЯ бы хотел опубликовать это как комментарий к ответу Тендаи Мавуше , но, боюсь, места недостаточно;)
Это соответствующая часть из источника 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;
Оттуда вы можете легко создать свой собственный валидатор.
источник
Самый «надежный» способ - проверить доступность URL:
public boolean isURL(String url) { try { (new java.net.URL(url)).openStream().close(); return true; } catch (Exception ex) { } return false; }
источник
Мой любимый подход без внешних библиотек:
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) { }
источник
Судя по исходному коду
URI
,public URL(URL context, String spec, URLStreamHandler handler)
конструктор выполняет больше проверок, чем другие конструкторы. Вы можете попробовать это, но YMMV.
источник
Мне не понравилась ни одна из реализаций (потому что они используют Regex, что является дорогостоящей операцией, или библиотеку, которая является излишним, если вам нужен только один метод), поэтому я закончил использовать класс java.net.URI с некоторыми дополнительные проверки и ограничение протоколов до: http, https, file, ftp, mailto, news, urn.
И да, перехват исключений может быть дорогой операцией, но, вероятно, не такой плохой, как регулярные выражения:
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; }
источник
пакет валидатора:
Кажется, есть хороший пакет от Йонатана Маталона под названием 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-адресов.
Другие фрагменты кода регулярного выражения:
На сайте Oracle и weberdev.com предпринимаются попытки проверки регулярных выражений .
источник