【问题标题】:servelt request parameter value contains ampersand?servlet 请求参数值包含与号?
【发布时间】:2013-09-17 17:55:26
【问题描述】:

我有下面的网址。

http://localhost:8080/servlet?user=John&message=hai&hello&recipient=scott

在上面的 url 中,我有 3 个请求参数,如下所示。

user=John
message=hai&hello
recipient=scott

这里的问题在于message 请求参数的值。因为这里它的值包含ampersend (&)。当我尝试request.getParameter("message") 时,我只得到hai 而不是hai&hello。我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: java url urlencode url-parameters


    【解决方案1】:

    试试这个,而不是....&message=hi%26hello....。我的意思是,编码它。

    [已编辑]

    正如你所说,你无法控制它,它是遗留应用程序,他们无法修复它;那么我想你仍然可以使用URLEncoder 对 URL 进行编码。

    String encodedUrl = URLEncoder.encode(url, "UTF-8");
    // Then use encodedUrl as you were using url.
    

    [已编辑]

    ..或者只是将其视为String。很简单,不是吗?

    // Please refactor.
    String[] paramPart = url.split("?");
    String[] params = paramPart[1].split("&");
    Map<String, String> paraMap = new HashMap<>();
    for(int i=0; i<params.length; i++) {
      String[] keyValue;
      if(params[i].contains("=")) {
        keyValue = params[i].split("=");
        paraMap.put(keyValue[0], keyValue[1]);
      } else {
        params[i-1] = params[i-1] + "&" + params[i];
        keyValue = params[i-1].split("=");
        paraMap.put(keyValue[0], keyValue[1]);
      }
    }
    

    【讨论】:

    • @Ansari,感谢您的回复。我无法控制 url。它是由一些外部客户端发送的...
    【解决方案2】:

    如果您确定&amp;recipient 总是在&amp;message 之后,或者&amp;message 可能是最后一个参数,或者您知道可能的参数集,那么您将需要从请求中获取查询字符串并尝试相应地拆分它。

    例如,如果&amp;recipient 总是在&amp;message 之后,那么你可以这样做(伪代码/未经测试):

    int s = queryString.indexOf("&message");
    int e = queryString.indexOf("&recipient");
    String messageValue = queryString.substring(s + "&message".length(), e);
    

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多