为什么不允许%

时间:2013-02-21 14:14:46

标签: java special-characters

如果我输入密码为Admin$&%^Admin$&^%,那么我的ajax调用有效但如果我输入就像这样 Admin$!%Admin$!%^。 ajax调用抛出异常.....

请帮忙,因为我无法找到此问题的根本原因

INFO: Character decoding failed. Parameter [txt_password] with value [Admin$!%] has been ignored. No
te that the name and value quoted here may be corrupted due to the failed decoding. Use debug level
logging to see the original, non-corrupted values.
java.io.CharConversionException: EOF
        at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:80)
        at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:46)
        at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:410)
        at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:370)
        at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:217)
        at org.apache.catalina.connector.Request.parseParameters(Request.java:2647)
        at org.apache.catalina.connector.Request.getParameter(Request.java:1106)
        at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355)
        at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

在探索时我发现:

Special characters are not allowed inside the query string. They must be replaced by a "%" followed by the ASCII code in Hex. E.g., "~" is replaced by "%7E", "#" by "%23" and so on. Since blank is rather common, it can be replaced by either "%20" or "+" (the "+" character must be replaced by "%2B"). This replacement process is called URL-encoding, and the result is a URL-encoded query string. 

这是否意味着我们不能将%用作输入字段中的值?

2 个答案:

答案 0 :(得分:1)

您正在尝试对先前步骤中已经过URL解码的字符串进行URL解码。这是你的根本原因。

您的两组经过验证和无效的字符串之间的差异是'&'字符。不确定为什么带有&符号的人验证...可能解析器在到达'%'之前停止,因为'&'被视为分隔符。

答案 1 :(得分:1)

终于得到了解决方案,

在查询字符串中添加参数之前,我使用了javascript的encodeURIComponent函数。 来自W3Schools

The encodeURI() function is used to encode a URI.
This function encodes special characters, except: , / ? : @ & = + $ # (Use encodeURIComponent() to encode these characters).

Tip: Use the decodeURI() function to decode an encoded URI.