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),它只会根据提供的协议列表(如httphttpsftp等)验证URL。

同样,还有一些其他标志,如ALLOW_2_SLASHESNO_FRAGMENTALLOW_ALL_SCHEMES,可以根据需要设置。有关库提供的所有选项的详细信息,请参阅官方文档

4. 总结

在这篇文章中,我们学习了两种不同的URL验证方式,并讨论了URL(String url)URL.toURI()之间的差异。

如果我们只需要验证协议和非空字符串,那么可以使用URL(String url)构造函数。然而,当我们需要验证并通过合规性检查时,需要使用URL(url).to URI()

此外,如果我们添加了Apache Commons依赖,我们可以使用URLValidator类进行验证,并且该类提供了更多的选项来定制验证规则。

如往常一样,本文中的示例代码可以在GitHub上找到。