为什么UrlValidator不适用于我的部分网址?

时间:2012-11-08 12:10:33

标签: java url-validation

String[] schemes = {"http","https"};
UrlValidator urlValidator = new UrlValidator(schemes, UrlValidator.ALLOW_ALL_SCHEMES);
System.out.println(urlValidator.isValid(myUrl));

以下网址表示无效。任何人都知道为什么会这样。 localnet是一个本地网络。但这适用于任何其他公共网络(似乎)。

http://aunt.localnet/songs/barnbeat.ogg

7 个答案:

答案 0 :(得分:4)

您正在使用的课程已弃用。替换是

org.apache.commons.validator.routines.UrlValidator

哪个更灵活。您可以将标志ALLOW_LOCAL_URLS传递给构造函数,该构造函数允许大多数地址,例如您正在使用的地址。在我们的例子中,我们在地址之前有认证数据,因此我们必须使用更加灵活的UrlValidator(RegexValidator authorityValidator, long options)构造函数。

答案 1 :(得分:3)

正如我所想,它在顶层失败;

String topLevel = domainSegment[segmentCount - 1];
if (topLevel.length() < 2 || topLevel.length() > 4) {
  return false;
}

您的最高级别为localnet

答案 2 :(得分:1)

这已在Apache Validator的1.4.1版本中修复:

https://issues.apache.org/jira/browse/VALIDATOR-342 https://issues.apache.org/jira/browse/VALIDATOR/fixforversion/12320156

简单升级到最新版本的验证器应该很好地解决问题。

答案 3 :(得分:0)

检查第2行 它应该是

new UrlValidator(schemes);

如果你想允许2个斜杠并禁止片段

new UrlValidator(schemes, ALLOW_2_SLASHES + NO_FRAGMENTS);

答案 4 :(得分:0)

以下是isValid(String)方法的源代码:

您可以通过手动调用检查每个步骤的结果,以了解失败的位置。

答案 5 :(得分:0)

此方法的库方法失败:

  "http://en.wikipedia.org/wiki/3,2,1..._Frankie_Go_Boom"

这是完全合法的([和现有的] URL(尝试一下,StackOverflow的对话框不接受它,但如果你复制粘贴到你的浏览器,你会看到一个维基百科页面)

我通过反复试验发现以下代码更准确:

public static 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;  
}

答案 6 :(得分:0)

您可以使用以下内容:

UrlValidator urlValidator = new UrlValidator(schemes, new RegexValidator("^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$"), 0L);