WT.*_*T.D 1 java apache validation url
问题是我们的前端认为这个 url 有效,而后端认为它不是。网址是
http://pyxlmedia.com/pc/talk=now&o=http://mobile.tmall.com/mobile。
你可以看到在 pc 这个词之后是一个 '/' 而不是 '?'。
如果我将 '/' 更改为 '?' 然后都通过,即
http://pyxlmedia.com/pc?talk=now&o=http://mobile.tmall.com/mobileorg.apache.commons.validator.routines.UrlValidator(1.5.1) 和站点
都认为有效
http://formvalidation.io/validators/uri/。
测试代码是
@Test
public void test() {
UrlValidator urlValidator = new UrlValidator(new String[] {"http", "https"});
assertTrue(urlValidator.isValid("http://pyxlmedia.com/pc/talk=now&o=http://mobile.tmall.com/mobile"));
}
Run Code Online (Sandbox Code Playgroud)
首先我想知道哪个是错误的,前端还是后端?那么如何让他们的行为保持一致呢?
我在分析这个时来回多次,但我对自己感到满意,你的前端在技术上是正确的,可以接受 URL。尽管如此,棘手的 URL 可能并不意味着您认为它意味着什么,因此您的后端可能会通过标记它来帮助您。
此处的相关标准由RFC 3986提供。(RFC 7230为“http”URI 方案指定了对语法的轻微修改,但这些不会改变给定 URL 的分析。)根据通用 URI 语法,输入 URL 分解为如下组件:
方案:http
(分隔符) ://
权威:pyxlmedia.com
路径:/pc/talk=now&o=http://mobile.tmall.com/mobile
请特别注意,该 URL 不包含查询组件,这与您提供的两个验证器都接受的变体不同。
路径组件包含五个段,您的后端验证器可能会被该组件的以下不寻常特征之一绊倒:
但是,对路径组件(RFC 3986 的第 3.3 节)的语法分析表明,绝对路径中除第一个之外的段允许为空,并且允许“:”字符和所有子分隔符在路径段中出现未转义。(并且 RFC 7230 也允许绝对路径的第一段为空。)
然而,从“我不认为这意味着你认为它意味着什么”部门,我想强调路径分为以下部分:
pc
Run Code Online (Sandbox Code Playgroud)
talk=now&o=http:
Run Code Online (Sandbox Code Playgroud)
(empty)
Run Code Online (Sandbox Code Playgroud)
mobile.tmall.com
Run Code Online (Sandbox Code Playgroud)
mobile
Run Code Online (Sandbox Code Playgroud)
请特别注意路径中的明显 URL 如何跨越四个路径段。
至于如何让行为保持一致,就看你真正想要哪种行为了。
ApacheUrlValidator没有很多配置选项,但它确实有一个选项,ALLOW_2_SLASHES它允许在 URL 的路径组件中使用双斜杠。我不确定打开该选项是否足以使其接受给定的 URL,但禁用它肯定会导致拒绝该 URL。如果这还不够,并且您想接受 URL,那么您似乎需要选择或编写不同的验证器。
就其本身而言,验证器 athttp://formvalidation.io/validators/uri/似乎有一组同样小但不同的配置选项,我没有看到其中一个我希望调整其对相关 URL 的评估。因此,如果您想在前端拒绝麻烦的 URL,那么您需要找到或编写不同的验证器。