首先,我正在使用Apache Commons的UrlValidator库的当前版本。我正在尝试验证像tcp://cor.rect.url:61616这样的FQDN URL,但是不幸的是,验证器使该URL无效。我正在使用以下参数创建Validator:

new UrlValidator(UrlValidator.ALLOW_ALL_SCHEMES + UrlValidator.ALLOW_LOCAL_URLS)


有人遇到过类似的问题吗?有什么解决方法吗?

最佳答案

根据UrlValidator 1的源代码,它调用DomainValidator,即validates the TLD in the URL

1完全合格的类名称为org.apache.commons.validator.routines.UrlValidator,请勿与已过时的实现org.apache.commons.validator.UrlValidator混淆

DomainValidator调用isValidTld来检查TLD。启用ALLOW_LOCAL_URLS选项后,它将首先根据isValidLocalTld中的本地TLD列表检查域名,然后根据isValidInfrastructureTldisValidGenericTldisValidCountryCodeTld检查域名。但是,url不在任何列表中。

在允许使用本地URL的情况下,DomainValidator对本地URL的domain name without dot进行最终检查(例如localhost),但是您的URL也不属于这种情况。

因此,您的URL被UrlValidator拒绝。

至于解决方案,似乎您可以定义自己的RegexValidator并将其传递给UrlValidator(RegexValidator authorityValidator, long options)构造函数。使用DomainValidator.isValidAuthority的源代码作为参考来从权限部分解析域并提供您自己的逻辑来验证域可能是一个好主意。

10-07 18:12