11

我对 Java 的 URLDecoder 有疑问。我正在转义 JavaScript 中的字符串,并将其发送到 java servlet。然后我使用以下行解码转义的字符串:

URLDecoder.decode(request.getParameter("text"), "UTF-8");

这适用于我尝试过的每个特殊字符,唯一的问题是“%”。每次在字符串中使用此字符时,都会出现以下异常:

java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
    java.net.URLDecoder.decode(URLDecoder.java:187)
    at.fhv.students.rotter.ajax.count.CountServlet.doGet(CountServlet.java:31)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

这是一个已知的错误?还是真的是我的错?

4

4 回答 4

10

这不是一个错误。您发送了错误的编码字符串。-%符号必须编码为%25

如果你调用 request.getParameter(),我想你会得到一个解码的字符串。

于 2012-05-14T19:55:07.547 回答
2

我们在 Angular 应用程序中遇到了类似的问题,我们%在客户端代码中对符号进行了一次编码。当我们收到 servlet 中的值时,由于request.getParameter(). 由于我们的服务器端代码中已经有 URL 解码器,因此对%符号进行两次解码会导致"URLDecoder: Incomplete trailing escape (%) pattern"异常。我们发现我们根本不应该将编码和解码%作为一个值来面对这个问题。

于 2015-09-24T10:58:55.870 回答
0

为了得到我写的参数

String requestURL=request.getQueryString(); 

这样它就会给我们参数。在固定长度或单个参数的情况下,我们可以String.substring()从中获取首选参数。然后

String decodeValue = URLDecoder.decode(value,"UTF-8"); 

也会得到首选字符串编码的 % 符号。

于 2013-06-20T08:20:31.930 回答
0

即使我遇到了类似的问题,它也得到了解决。以下是您可以简单地运行以重现和解决此问题的示例代码。

public class TestPercentage {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String transResult = "Se si utilizza DHCP%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NICyUSEWINS%25%24%23%24%23%24%23Se si utilizza WINS%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NODEFULL%25%24%23%24%23%24%23Nome completo del computer%24%23%24%23%24%23%25NODENAME%25%24%23%24%23%24%23I primi 8 caratteri del nome effettivo del computer%24%23%24%23%24%23%25NWCONTEXT%25%24%23%24%23%24%23Nome contesto NetWare%24%23%24%23%24%23%25NWSERVER%25%";
        String decode = null;
        try {
            decode = URLDecoder.decode(transResult, "UTF-8");
        } catch (UnsupportedEncodingException ue) {
            System.out.println("UnsupportedEncodingException ! = " + ue);
        } catch (IllegalArgumentException ile) {
            System.out.println("IllegalArgumentException ! = " + ile);
            if (transResult.endsWith("%")) {
                transResult = transResult.substring(0, transResult.lastIndexOf("%"));
                System.out.println("transResult2 = " + transResult);
                try {
                decode = URLDecoder.decode(transResult, "UTF-8");
                } catch (UnsupportedEncodingException ue2) {
                    System.out.println("UnsupportedEncodingException 2 = " + ue2);
                } catch (IllegalArgumentException ile2) {
                    System.out.println("IllegalArgumentException ! = " + ile2);
                }
            }
        }
        System.out.println("decode = " + decode);
    }

}
于 2018-08-22T13:25:23.407 回答