Java URLDecoder在处理包含%的字符串时会抛出异常

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)

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


1
我正在JavaScript中转义一个字符串。怎么做?你一定做错了。 - user207421
4个回答

10

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

如果您调用request.getParameter(),我认为您会得到一个解码后的字符串。


2
我们在angular应用中遇到了类似的问题,我们在客户端代码中对百分号%进行了一次编码。当我们在servlet中接收到这个值时,它已经被解码了,因为是由request.getParameter()完成的。由于我们在服务器端代码中已经使用URL解码器,所以再次对%进行解码会导致"URLDecoder: Incomplete trailing escape (%) pattern"异常。我们发现,为了避免这个问题,我们不应该将%作为值进行编码和解码。

我遇到了确切的问题。我从像 /getsomething/{text} 这样的 URL 切换到了 /getsomething?text=,因此需要对来自该 URL 的解码进行处理。 - MikeKulls

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);
    }

}

0
为了获取参数,我已经编写了以下代码:
String requestURL=request.getQueryString(); 

这样它将给我们参数。从那里,我们可以使用String.substring()来获取固定长度或单个参数的首选参数。然后

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

将获得首选字符串编码的百分号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接