1. 概述
URL 是统一资源定位符,它是网络上唯一资源的地址。
在这个教程中,我们将讨论如何使用 Java 验证 URL。在现代web开发中,通过应用程序读取、写入或访问URL非常常见。因此,成功验证确保了URL的有效性和合规性。
有多种库用于验证URL。我们将探讨两个类:JDK的java.net.URL
类和Apache Commons库的org.apache.commons.validator.routines.UrlValidator
类。
2. 使用JDK验证URL
让我们看看如何使用java.net.URL
类来验证URL:
boolean isValidURL(String url) throws MalformedURLException, URISyntaxException {
try {
new URL(url).toURI();
return true;
} catch (MalformedURLException e) {
return false;
} catch (URISyntaxException e) {
return false;
}
}
在这个方法中,new URL(url).toURI();
尝试使用String
参数创建一个URI
。如果传递的String
不符合URL语法,库会抛出异常。
内置的URL
类在发现输入String
对象中的语法错误时会抛出MalformedURLException
。当String
的格式不合规时,内置类会抛出URISyntaxException
。
现在,让我们通过一个小测试验证我们的方法是否有效:
assertTrue(isValidURL("http://baeldung.com/"));
assertFalse(isValidURL("https://www.baeldung.com/ java-%%$^&& iuyi"));
需要了解URL和URI之间的区别。toURI()
方法在此处很重要,因为它确保任何符合RFC 2396的URL字符串被转换为URL
。然而,如果我们只使用new URL(String value)
,则无法确保创建的URL完全合规。
让我们通过一个例子来看看,如果我们只使用new URL(String url)
,许多不合规的URL将通过验证:
boolean isValidUrl(String url) throws MalformedURLException {
try {
// it will check only for scheme and not null input
new URL(url);
return true;
} catch (MalformedURLException e) {
return false;
}
}
现在让我们看看上述方法如何处理不同URL的验证:
assertTrue(isValidUrl("http://baeldung.com/"));
assertTrue(isValidUrl("https://www.baeldung.com/ java-%%$^&& iuyi"));
assertFalse(isValidUrl(""));
在上述方法中,new URL(url)
仅检查有效的协议和非空字符串作为输入。因此,如果协议正确,即使不符合RFC 2396,它也会返回一个URL
对象。
因此,我们必须使用new URL(url).toURI()
来确保URL是有效且合规的。
3. 使用Apache Commons验证URL
我们需要将commons-validator
依赖项导入到我们的pom.xml
文件中:
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.7</version>
</dependency>
让我们使用库中的UrlValidator
类进行验证:
boolean isValidURL(String url) throws MalformedURLException {
UrlValidator validator = new UrlValidator();
return validator.isValid(url);
}
在上述方法中,我们首先创建一个UrlValidator
实例,然后使用isValid()
方法检查String
参数的URL有效性。
让我们看看上述方法对不同输入的行为:
assertFalse(isValidURL("https://www.baeldung.com/ java-%%$^&& iuyi"));
assertTrue(isValidURL("http://baeldung.com/"));
UrlValidator
允许我们精细调整URL字符串的验证条件。例如,如果我们使用重载构造函数UrlValidator(String[] schemes)
,它只会根据提供的协议列表(如http
、https
、ftp
等)验证URL。
同样,还有一些其他标志,如ALLOW_2_SLASHES
、NO_FRAGMENT
和ALLOW_ALL_SCHEMES
,可以根据需要设置。有关库提供的所有选项的详细信息,请参阅官方文档。
4. 总结
在这篇文章中,我们学习了两种不同的URL验证方式,并讨论了URL(String url)
和URL.toURI()
之间的差异。
如果我们只需要验证协议和非空字符串,那么可以使用URL(String url)
构造函数。然而,当我们需要验证并通过合规性检查时,需要使用URL(url).to URI()
。
此外,如果我们添加了Apache Commons依赖,我们可以使用URLValidator
类进行验证,并且该类提供了更多的选项来定制验证规则。
如往常一样,本文中的示例代码可以在GitHub上找到。