我正在编写一个Java应用程序,它接受可能编码或不编码的URL参数值。我需要一种简单的方法来判断是否需要对参数字符串进行编码。
换句话说,我想要一个函数boolean needsEncoding(String param)
,如果我传入字符串“foo@test.com”,它将返回true,如果我传入“foo%40test.com”则返回false。这个想法的问题是这是模棱两可的。我怎么知道后一个字符串中的“%”符号是否应该被编码?处理此问题的一种方法是修改我的合同 - 要求客户端传入未编码的字符串,以便我知道我总是需要对它们进行编码。想法?
答案 0 :(得分:6)
我以为我会把它作为一个建议的答案,以便人们可以投票:
处理此问题的一种方法是修改我的合同 - 要求客户端传入未编码的字符串,以便我知道我总是需要对它们进行编码。
答案 1 :(得分:1)
如何解码字符串并检查原始字符串和解码字符串之间的所有差异是否为有效的url实体。
答案 2 :(得分:0)
签名字符串已被URL编码:
但是我认为更改合同是建议采取的行动。
答案 3 :(得分:0)
您可以在输入上使用java.net.URLDecoder
,并通过比较输入和输出字符串值来查看它是否发生了变化。查看URLDecoder
的{{3}},它描述了它应用于输入String的业务逻辑,以确定它是否需要URL解码。
如果你必须获得boolean
结果并且不想产生尝试解码的开销以获得boolean
结果,你总是可以破解URLDecoder
的源代码类,并使用相同的业务逻辑来确定是否需要URL解码。
答案 4 :(得分:0)
这是我处理此问题的常用方法。首先,因为+是一个烦人的特殊情况,我不允许它作为编码的一部分。如果他们加了一个加号,如果他们想要一个空格,他们可以按下键盘底部的那个大条。 (是的,我已经将其作为一些合同的一部分)。但实际上,你可以解释它,因为你为你的客户努力工作,他们不必担心自己编码。
然后我重写java.net.URLDecoder.decode
以删除' +'案件。 (真的只是切入并粘贴到我用于该项目的任何实用程序类中,并删除~4行)。
然后,对于我得到的一切,我只是通过解码器,然后是编码器。如果编码,这将对其进行解码和重新编码,或者如果未编码则对其进行编码。我从几年前的某个人那里得到了这个小费,不记得是谁给予了适当的信任。
所以我最终得到了:
String properlyencodedstring =
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");
这可能需要调整的唯一时间是在需要输入和处理大量网址的数据的情况下,我转换我的假设,使用input type="url"
(使用某种javascript polyfill对于旧浏览器而言,并使用.replaceAll("+", " ")
进行预处理,因为在这种情况下不允许输入任何空格。 (并且很可能无论如何都要使用java.net.URI
)