2008-10-08 172 views
3

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

换句话说,我想要一个函数boolean needsEncoding(String param),如果我传入字符串“[email protected]”,将返回true;如果我传入“foo%40test.com”,则返回false。这个想法的问题是这是不明确的。我怎么知道后一个字符串中的“%”符号是否应该被编码?处理这个问题的一个方法是修改我的合同 - 要求客户端传递未编码的字符串,以便我知道我总是需要对它们进行编码。思考?

回答

6

我想我应该把这个作为一个建议的回答,使人们可以投票:

一种方式来处理,这是改变我的合同 - 要求客户在未编码字符串传递这样我才知道我总是需要对它们进行编码。

+0

我投了你的答案。改变合同是有道理的 – anjanb 2008-10-08 17:21:00

+0

总是最好不要猜测。 – Rontologist 2008-10-08 17:24:22

+0

如果用户想设置foo%40test.com,则无法检测用户是否想要f​​oo%40test.com或[email protected]。改变合同。 – Horcrux7 2008-10-08 20:53:40

0

迹象字符串已经URL编码:

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

不过,我认为,改变合同是推荐这里的行动。

1

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

0

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

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

0

这是我处理这个问题的常用方法。首先,由于+是一个恼人的特例,我不允许它作为编码的一部分。如果他们加上一个加号,这是一个加号,如果他们想要一个空格,他们可以按下键盘底部的那个大号栏。 (是的,我已经把它作为一些合同的一部分)。但是,实际上,当你为你的客户努力工作时,你可以将其解释清楚,以免他们自己编码。

然后我重写java.net.URLDecoder.decode删除“+”的情况。 (真的只是切割和粘贴到我为该项目使用的任何实用程序类,并删除〜4行)。

然后,对于我得到的所有东西,我只是通过解码器,然后运行编码器。这将解码并重新编码它,如果编码,或编码它,如果没有编码。我从几年前的某个人那里得到了这个建议,不记得谁给予适当的信贷。

所以我结束了:

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

唯一的一次,在这可能需要的调整将是大群体需要的URL的数据的情况下,要输入和处理,是将我的假设,使用input type="url"(对于旧浏览器使用某种JavaScript填充),并使用.replaceAll("+", " ")进行预处理,因为在这种情况下不会允许输入任何空格。 (很可能,反正用java.net.URI

相关问题