【问题标题】:URL is considered invalid by Apache UrlValidatorApache UrlValidator 认为 URL 无效
【发布时间】:2017-02-04 04:43:34
【问题描述】:

问题是我们的前端认为这个 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/mobile 两者都认为有效 org.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"));
}

首先我想知道哪个是错的,前端还是后端?那么如何让他们的行为保持一致呢?

【问题讨论】:

  • 这里的前端是什么意思?

标签: java apache validation url


【解决方案1】:

我来回分析了几次,但我确信您的前端在技术上是正确的,可以接受 URL。尽管如此,这个诡异的 URL 可能并不像您认为的那样,因此您的后端可能会通过标记它来帮您一个忙。

这里的相关标准由RFC 3986提供。 (RFC 7230 为“http” URI 方案指定了对语法的轻微修改,但这些不会改变对给定 URL 的分析。)根据一般的 URI 语法,输入 URL 分成如下组件:

方案http

(分隔符)://

权威pyxlmedia.com

路径/pc/talk=now&o=http://mobile.tmall.com/mobile

请特别注意,该 URL 不包含查询组件,这与您提供的两个验证器都接受的变体不同。

路径组件包含五个段,您的后端验证器可能会遇到该组件的以下异常特征之一:

  • 一段为空
  • 第二段包含非转义字符“=”和“&”,URI 语法将其归类为“子分隔符”
  • 第二段包含一个未转义的 ':' 字符,URI 语法将其归类为“gen-delim”

但是,对路径组件的语法分析(RFC 3986 的第 3.3 节)表明,绝对路径中除第一个以外的段允许为空,并且“:”字符和所有子分隔符允许在路径段中出现未转义。 (RFC 7230 也允许绝对路径的第一段为空。)

然而,从“我不认为这意味着你认为它意味着什么”部门,我想强调路径分为以下几个部分:

pc
talk=now&o=http:
(empty)
mobile.tmall.com
mobile

请特别注意路径中的明显 URL 如何拆分为四个路径段。


至于如何让行为一致,就看你真正想要的行为了。

Apache UrlValidator 没有很多配置选项,但它确实 有一个是ALLOW_2_SLASHES,它允许在 URL 的路径组件中使用双斜杠。我不确定打开该选项是否足以使其接受给定的 URL,但禁用它肯定会导致拒绝 URL。如果这不够并且您想接受该 URL,那么您似乎需要选择或编写不同的验证器。

就其本身而言,http://formvalidation.io/validators/uri/ 的验证器似乎具有同样小但不同的一组配置选项,我看不到其中一个我希望调整其对相关 URL 的评估。因此,如果您想在前端拒绝麻烦的 URL,那么您需要找到或编写不同的验证器。

【讨论】:

  • 是的,添加 ALLOW_2_SLASHES 确实允许 URL 通过。
【解决方案2】:

在任何 URL 中,如果您使用 get 方法(通过嵌入 URL)将任何变量发送到后端,那么它应该用“?”分隔。从 URL 的其余部分。这是标准的。

例如:-

HTTPS://Google.com?search=animals

【讨论】:

  • NMDV,但这并不能真正解决问题。它说明的是 URL 的含义,而不是其有效性。
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多