gpt4 book ai didi

java - URI getRawQuery 与 getQuery

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:28 24 4
gpt4 key购买 nike

我认为使用 getQuery丢失信息,很危险,而只有 getRawQuery应该使用,并且任何已知编码的查询参数值都应该用 URLDecoder 手动解码(一旦原始查询在 & 字符上拆分) .

恰当的例子:假设您的 URL www.example.com 带有两个查询参数:

  • 参数 url 的值为 =www.otherexample.com?b=2&c=3
  • 一个不起眼的参数 d,值为 4。

参数 url 应该是 url 编码的,因此您的应用程序看到的 URI 是:

www.example.com?url=www%2Eotherexample%2Ecom%3Fb%3D2%26c%3D3&d=4

现在,如果您使用 getQuery 获取查询部分,你会得到以下内容:

url=www.otherexample.com?b=2&c=3&d=4

请注意,您已经丢失了信息,因为您无法确定 dwww.example.com 还是 www 的查询参数.otherexample.com.

相反,如果您使用 getRawQuery 获取查询部分,你会得到以下内容:

url=www%2Eotherexample%2Ecom%3Fb%3D2%26c%3D3&d=4

这一次,没有信息丢失,一切都很好。如果愿意,您可以解析查询部分并对 url 参数的值进行 URL 解码。

我错过了什么吗?

最佳答案

你是对的。URI.getQuery() 已损坏,您不应使用它。

奇怪的是,除了您的帖子外,我找不到任何对此的确认,这让我觉得 URI.getQuery 可能对某些事情有用。但经过我自己的一些测试后,我很确定它不应该被使用,除非你的应用程序的查询字符串不遵循用&符号分隔参数的约定。

编辑 2019 年 11 月 11 日

正如在下面的评论中指出的,虽然您可以使用 URI.getRawQuery() 来解决损坏的 URI.getQuery() 方法,但您不能只使用原始查询作为多参数的查询参数URI 构造函数,因为该构造函数也已损坏。

如果任何查询字符串参数包含与号,则不能使用多参数 URI 构造函数。您可能会争辩说这是一个错误,但预期行为的文档自相矛盾,因此不清楚哪种行为是正确的。多参数构造函数的 javadoc 说“引用任何不是合法 URI 字符的字符”。这意味着不应引用转义的八位字节,因为主类文档将其作为合法字符包含(“所有合法 URI 字符的集合由未保留的、保留的、转义的和其他字符组成”)。但更进一步,它记录了观察到的行为,即百分号字符 ('%') 总是被多参数构造函数引用,人们假设它不考虑它是否是转义八位字节的一部分。

无论是否承认文档自相矛盾,或者正确的行为应该是什么,几乎可以肯定的是,当前行为永远不会改变。唯一的解决方法是如果您需要 URI 最终包含带引号的 & 符号八位位组“%26”,则不要使用多参数构造函数。在对特殊字符进行您自己的编码和引号后,改用单参数构造函数。

关于java - URI getRawQuery 与 getQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com