3

我正在编写一个 Java 应用程序,它接受可能编码或未编码的 URL 参数值。我需要一种简单的方法来判断我是否需要对参数字符串进行编码。

换句话说,我想要一个函数boolean needsEncoding(String param),如果我传入字符串“foo@test.com”,它将返回 true,如果传入“foo%40test.com”,它将返回 false。这个想法的问题在于这是模棱两可的。我怎么知道后一个字符串中的“%”符号是否应该被编码?处理此问题的一种方法是修改我的合同 - 要求客户端传入未编码的字符串,以便我知道我总是需要对它们进行编码。想法?

4

5 回答 5

6

我想我会把它作为一个建议的答案,以便人们可以投票:

处理此问题的一种方法是修改我的合同 - 要求客户端传入未编码的字符串,以便我知道我总是需要对它们进行编码。

于 2008-10-08T17:10:47.853 回答
1

如何解码字符串并检查原始字符串和解码字符串之间的所有差异是否都是有效的 url 实体。

于 2008-10-08T17:22:22.497 回答
0

您可以java.net.URLDecoder在输入上使用并通过比较输入和输出字符串值来查看它是否发生变化。查看JavadocsURLDecoder它描述了它应用于输入字符串以确定它是否需要 URL 解码的业务逻辑。

如果你必须得到一个boolean结果并且不想产生试图解码来得到那个boolean结果的开销,你总是可以破解打开URLDecoder类的源代码并使用它使用的相同的业务逻辑来确定是否需要 URL 解码。

于 2008-10-08T20:15:46.547 回答
0

标志字符串已被 URL 编码:

  1. 没有空格,但有很多加号。
  2. 所有百分号后跟两位数字。
  3. 其中没有 a..b、A..B、0..9、“.”、“_”、“-”、“*”、“%”和“+”之外的字符。

但是我认为更改合同是这里推荐的操作。

于 2008-10-08T17:16:09.980 回答
0

这是我处理这个问题的正常方法。首先,由于 + 是一个烦人的特殊情况,我不允许它作为编码的一部分。如果他们输入一个加号,那就是一个加号,如果他们想要一个空间,他们可以按键盘底部的那个大条。(是的,我已将其作为某些合同的一部分)。但实际上,当您为客户努力工作时,您可以将其解释清楚,以至于他们不必担心自己对其进行编码。

然后我重写java.net.URLDecoder.decode以删除'+'案例。(实际上只是剪切和粘贴到我用于该项目的任何实用程序类中,然后删除约 4 行)。

然后对于我得到的所有东西,我只是通过解码器运行它,然后是编码器。如果已编码,这将对其进行解码和重新编码,如果未编码,则对其进行编码。几年前我从某人那里得到了这个提示,不记得应该给予谁适当的信任。

所以我最终得到:

String properlyencodedstring = 
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");

这可能需要调整的唯一时间是在需要输入和处理具有大量 url 组的数据的情况下,我改变我的假设,使用input type="url"(对于旧浏览器使用某种 javascript polyfill),并预处理.replaceAll("+", " "),因为在这种情况下不允许输入任何空格。(而且很可能,java.net.URI无论如何都要使用)

于 2014-06-08T18:29:37.637 回答