在Java中验证URL

Key*_*eya 96 java validation url

我想知道Java中是否有任何标准API来验证给定的URL?我想检查URL字符串是否正确,即给定协议是否有效,然后检查是否可以建立连接.

我尝试使用HttpURLConnection,提供URL并连接到它.我的要求的第一部分似乎已经完成但是当我尝试执行HttpURLConnection.connect()时,抛出'java.net.ConnectException:Connection refused'异常.

这可能是因为代理设置?我尝试为代理设置系统属性但没有成功.

让我知道我做错了什么.

Yon*_*tan 142

为了社区的利益,因为在搜索
" url validator java " 时,此主题在Google上排名第一


捕获异常是昂贵的,应尽可能避免.如果您只想验证String是否是有效的URL,则可以使用Apache Commons Validator项目中的UrlValidator类.

例如:

String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp"
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("ftp://foo.bar.com/")) {
   System.out.println("URL is valid");
} else {
   System.out.println("URL is invalid");
}
Run Code Online (Sandbox Code Playgroud)

  • 该URLValidator类已标记为已弃用.推荐的URLValidator位于例程包中:http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/UrlValidator.html (36认同)
  • 我没看到这是**标准API** (17认同)
  • @AlexAverbuch:您能否概述一下UrlValidator的问题?说它们存在但不说它们是什么并不是很有帮助. (8认同)
  • @Spektr我已修复链接.谢谢. (6认同)
  • 我们使用安全扫描软件来识别第三方库中的安全漏洞,不幸的是commons-validator包含被识别为红色(安全漏洞)的commons-beanutils。是否还有另一个(更精简的)库/API? (3认同)
  • UrlValidator有一系列已知问题.是否有更积极维护的备用库? (2认同)
  • 关于commons库的一个问题:为什么这些函数不是简单的静态函数?为什么我需要创建一个 UrlValidator 对象来验证 1 个 URL?他们拥有那个“状态”有什么用处? (2认同)
  • @ParthMehrotra 我晚了 4 年,但主要原因是您可以在测试中模拟验证,并且您也可以将验证器注册为 bean 并仅配置一次。 (2认同)

Oll*_*lly 36

您需要创建URL对象和URLConnection对象.以下代码将测试URL的格式以及是否可以建立连接:

try {
    URL url = new URL("http://www.yoursite.com/");
    URLConnection conn = url.openConnection();
    conn.connect();
} catch (MalformedURLException e) {
    // the URL is not in a valid form
} catch (IOException e) {
    // the connection couldn't be established
}
Run Code Online (Sandbox Code Playgroud)

  • 这非常非常昂贵.openConnection/connect实际上会尝试连接到http资源.这必须是我见过验证URL的最昂贵的方法之一. (21认同)
  • 连接仅验证主机可用性。与URL的有效性无关。 (2认同)
  • MalformedURLException 不是测试 URL 有效形式的安全策略。这个答案有误导性。 (2认同)

Mar*_*tin 33

java.net.URL实际上,这个类并不是验证URL的好方法.MalformedURLException不是扔在施工期间的所有格式不正确的URL.追赶IOExceptionjava.net.URL#openConnection().connect()并没有任何确认的网址,只告诉羯羊或不能够建立连接.

考虑一下这段代码:

    try {
        new URL("http://.com");
        new URL("http://com.");
        new URL("http:// ");
        new URL("ftp://::::@example.com");
    } catch (MalformedURLException malformedURLException) {
        malformedURLException.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

..不会抛出任何例外.

我建议使用一些使用无上下文语法实现的验证API,或者在非常简化的验证中使用正则表达式.但是我需要有人为此建议一个优质或标准的API,我最近才开始自己搜索它.

注意 有人建议,URL#toURI()结合处理异常java.net. URISyntaxException可以促进URL的验证.但是,这种方法只能抓住上面一个非常简单的案例.

结论是没有标准的java URL解析器来验证URL.


b1n*_*phy 12

使用标准API,将字符串传递给URL对象,然后将其转换为URI对象.这将根据RFC2396标准准确地确定URL的有效性.

例:

public boolean isValidURL(String url) {  

    URL u = null;

    try {  
        u = new URL(url);  
    } catch (MalformedURLException e) {  
        return false;  
    }

    try {  
        u.toURI();  
    } catch (URISyntaxException e) {  
        return false;  
    }  

    return true;  
} 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此字符串 - > url-> uri验证方案报告这些测试用例有效:"http://.com""http:// com." "ftp:// :::: @ example.com""http:/test.com""http:test.com""http:/:"因此,虽然这是标准API,但它适用的验证规则可能不是人们的期望. (5认同)

pen*_*Dev 9

使用android.webkit.URLUtilon android:

URLUtil.isValidUrl(URL_STRING);
Run Code Online (Sandbox Code Playgroud)

注意:它只是检查URL的初始方案,而不是整个URL是有效的.

  • 仅当您在课程的android应用程序上工作时。 (2认同)

den*_*ned 6

有一种方法可以严格按照Java中的标准执行URL验证,而无需借助第三方库:

boolean isValidURL(String url) {
  try {
    new URI(url).parseServerAuthority();
    return true;
  } catch (URISyntaxException e) {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

URIcheck 的构造函数url是有效的URI,并对其进行调用以parseServerAuthority确保它是URL(绝对或相对)而不是URN。

  • @阿苏是的。第二个“://”位于主机之后,“:”引入端口号,根据语法,端口号可以为空。`//` 是路径中带有空段的部分,这也是有效的。如果您在浏览器中输入此地址,它将尝试打开它(但很可能找不到名为“https”的服务器;))。 (2认同)

Nic*_*kDK 0

您确定使用正确的代理作为系统属性吗?

另外,如果您使用 1.5 或 1.6,您可以将 java.net.Proxy 实例传递给 openConnection() 方法。在我看来,这是更优雅的:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);
Run Code Online (Sandbox Code Playgroud)