如何编码的URL,以避免在Java中的特殊字符
我需要Java代码来编码的URL,以避免特殊字符,如空格和%和…等
URL的构造是棘手的,因为URL的不同部分对于允许什么字符具有不同的规则:例如,加号在URL的查询组件中被保留,因为它表示空间,但是在URL的path组件中,加号无特殊含义,空格编码为“%20”。
RFC 2396解释了(在第2.4.2节中)一个完整的URL总是以其编码的forms出现:你为各个组件(scheme,权威,path等)取得string,按照自己的规则对每个字符进行编码,然后将它们组合成完整的URLstring。 试图build立一个完整的未编码的URLstring,然后单独编码导致微妙的错误,如path中的空格被错误地更改为加号(符合RFC的服务器将解释为真实加号,而不是编码空格)。
在Java中,构buildURL的正确方法是使用URI
类。 使用将URL组件作为单独string的多参数构造函数之一,并根据该组件的规则正确地转义每个组件。 toASCIIString()
方法为您提供了可以发送到服务器的正确转义和编码的string。 要解码 URL,请使用单string构造函数构造一个URI
对象,然后使用访问器方法(如getPath()
)来检索解码的组件。
不要使用URLEncoder
类! 尽pipe名称,该类实际上是HTML表单编码,而不是URL编码。 连接未编码的string以创build“未编码”的URL,然后通过URLEncoder
传递它是不正确的。 这样做会导致问题(特别是上述有关空间和路标中的加号的问题)。
这是下面的问题的重复。 您可以在下面的问题中find关于这个问题的更详细的信息和讨论
Java中的HTTP URL地址编码
public class URLParamEncoder { public static String encode(String input) { StringBuilder resultStr = new StringBuilder(); for (char ch : input.toCharArray()) { if (isUnsafe(ch)) { resultStr.append('%'); resultStr.append(toHex(ch / 16)); resultStr.append(toHex(ch % 16)); } else { resultStr.append(ch); } } return resultStr.toString(); } private static char toHex(int ch) { return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10); } private static boolean isUnsafe(char ch) { if (ch > 128 || ch < 0) return true; return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0; } }
如果你不想手动使用Apache Commons – Codec库。 你正在看的类是: org.apache.commons.codec.net.URLCodec
String final url = "http://www.google.com?...." String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
我会回应Wyzard写的,但补充说:
- 对于查询参数,HTML编码通常正是服务器所期望的;
URLEncoder
不应使用URLEncoder
- 最近的URI规范是RFC 3986 ,所以你应该把它作为主要来源
我写了一篇关于这个主题的博文: Java:安全字符处理和URL构build
Simialar问题可以在这里find:
Java中的HTTP URL地址编码
这是我的解决scheme,这很容易:
而不是编码url本身我编码我传递的参数,因为参数是用户input,用户可以input任何意外的特殊字符的string,所以这对我工作好:)
String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/ try { review = URLEncoder.encode(review,"utf-8"); review = review.replace(" " , "+"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String URL = "www.test.com/test.php"+"?user_review="+review;