首先,我正在使用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列表检查域名,然后根据isValidInfrastructureTld
,isValidGenericTld
和isValidCountryCodeTld
检查域名。但是,url
不在任何列表中。
在允许使用本地URL的情况下,DomainValidator
对本地URL的domain name without dot进行最终检查(例如localhost
),但是您的URL也不属于这种情况。
因此,您的URL被UrlValidator
拒绝。
至于解决方案,似乎您可以定义自己的RegexValidator
并将其传递给UrlValidator(RegexValidator authorityValidator, long options)
构造函数。使用DomainValidator.isValidAuthority
的源代码作为参考来从权限部分解析域并提供您自己的逻辑来验证域可能是一个好主意。