1. 概述
URL代表统一资源定位器,它是Web上唯一资源的地址。
在本教程中,我们将讨论使用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语法,则将抛出Exception。
当内置URL类在输入String对象中发现格式错误的语法时,它会抛出MalformedURLException。当String的格式不兼容时,内置类会抛出URISyntaxException。
现在,让我们通过一个小测试来验证我们的方法是否有效:
assertTrue(isValidURL("http://tuyucheng.com/"));
assertFalse(isValidURL("https://www.tuyucheng.com/ java-%%$^&& iuyi"));
我们必须了解URL和URI之间的区别。toURI()方法在这里很重要,因为它确保任何符合RC 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://tuyucheng.com/"));
assertTrue(isValidUrl("https://www.tuyucheng.com/ java-%%$^&& iuyi"));
assertFalse(isValidUrl(""));
在上述方法中,new URL(url)仅检查有效协议和空字符串作为输入。因此,即使它不符合RC 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.tuyucheng.com/ java-%%$^&& iuyi"));
assertTrue(isValidURL("http://tuyucheng.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).toURI()。
此外,如果我们添加Apache Commons依赖项,我们可以使用URLValidator类来执行验证,并且该类中还有其他可用选项来微调验证规则。
与往常一样,本教程的完整源代码可在GitHub上获得。