问题是我们的前端认为这个网址有效,而后端认为不是。
网址是
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"));
}
首先我想知道哪一个是错的,前端还是后端?然后如何使他们的行为保持一致?
答案 0 :(得分:4)
在我分析这个问题时,我经常来回几次,但我对自己的前端在接受URL方面技术上是正确的感到满意。然而,棘手的URL可能并不意味着你认为它意味着什么,所以你的后端可能会通过标记它来帮助你。
此处的相关标准由RFC 3986提供。 (对于“http”URI方案,RFC 7230为语法稍作修改,但这些修改不会改变给定URL的分析。)根据一般的URI语法,输入URL会分成这样的组件:
计划:http
(分隔符)://
权限:pyxlmedia.com
路径:/pc/talk=now&o=http://mobile.tmall.com/mobile
请特别注意,URL不包含查询组件,这与您提供的两个验证器都接受的变体不同。
路径组件包含五个段,并且您的后端验证器可能会跳过该组件的这些不寻常特征之一:
但是,对路径组件语法的分析(RFC 3986的第3.3节)显示绝对路径中第一个以外的段被允许为空,并且':'字符和所有子delim允许在路径段中显示未转义。 (而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,则需要查找或编写不同的验证器。
答案 1 :(得分:-1)
在任何网址中,如果您使用get方法将任何变量发送到后端(通过嵌入在URL中),那么它应该被“?”分隔。从URL的其余部分。这是标准的。
例如: -
HTTPS://Google.com?search=animals