【问题标题】:getParameter special charactersgetParameter 特殊字符
【发布时间】:2013-12-19 18:47:10
【问题描述】:

我正在尝试在 jee 中获取 url 参数。 所以我有这种网址:

http://MySite/MySite.jsp?page=recherche&msg=toto

首先我尝试使用:request.getParameter("msg").toString(); 它运作良好,但如果我尝试搜索 "c++" ,方法 "getParameter()" 返回 "c" 而不是 "c​​++" 我明白了。

所以我尝试了另一件事。我获取当前 URL 并对其进行解析以获取消息的值:

String msg[]= request.getQueryString().split("msg=");
message=msg[1].toString();

它现在适用于研究“c++”,但现在我无法搜索口音。我能做什么?

编辑 1

我在 url 中编码消息

String urlString=Utils.encodeUrl(request.getParameter("msg"));

所以对于 URL:http://MySite/MySite.jsp?page=recherche&msg=c++

我有这个编码的 URL:http://MySite/MySite.jsp?page=recherche&msg=c%2B%2B

当我需要它时,我会解码 URL 的消息

String decodedUrl = URLDecoder.decode(url, "ISO-8859-1");

谢谢大家

【问题讨论】:

    标签: java special-characters url-parameters


    【解决方案1】:

    您通过“get”方法发送的任何内容都将作为 url 的一部分,如果它包含至少一个保留字符,则需要对其进行 urlencoded 以使其有效。因此,任何字符都需要在发送前进行编码。

    要发送c++,您必须发送c%2B%2B。这将在服务器端正确解释。

    您可以在这里查看一些参考资料:

    http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

    现在的问题是,您如何以及在哪里生成 URL?根据语言,您需要使用正确的方法对字符串进行编码。

    【讨论】:

      【解决方案2】:

      如果我尝试搜索 "c++" ,方法 "getParameter()" 返回 "c" 而不是 "c​​++"

      查询参数被视为application/x-www-form-urlencoded,因此URL 中的+ 字符表示参数值中的空格字符。如果要发送+ 字符,则需要在URL 中将其编码为%2B

      http://MySite/MySite.jsp?page=recherche&msg=c%2B%2B
      

      这同样适用于重音字符,它们需要作为其 UTF-8 表示的字节进行转义,因此 été 需要:

      msg=%C3%A9t%C3%A9
      

      é 是 Unicode 字符 U+00E9,即 UTF-8 中的 C3 A9)。

      简而言之,这不是这段代码的错,而是负责在客户端构建 URL 的任何组件的错。

      【讨论】:

        【解决方案3】:

        调用你的网址

        msg=c%2B%2B
        

        + 在 URL 中的意思是“空格”。它需要被转义。

        【讨论】:

          【解决方案4】:

          在将特殊字符作为 URL 参数传递时,您需要对其进行转义。由于+是空格,&是另外一个参数,所以不能作为参数值。

          查看其他S.O. question

          您可能希望使用 Apache HTTP 客户端库来帮助您进行 URL 编码/解码。 The URIUtil class 有你需要的。

          这样的事情应该可以工作:

          String rawParam = request.getParameter("msg");
          String msgParam = URIUtil.decode(rawParam);
          

          您的示例表明数据未在客户端正确编码。请参阅此JavaScript 问题。

          【讨论】:

          • 不,servlet 引擎将为您解码 url 参数。您不应该手动执行此操作。
          猜你喜欢
          • 2014-11-03
          • 1970-01-01
          • 2015-07-10
          • 2011-02-24
          • 2016-02-09
          • 2012-11-21
          • 2020-12-22
          • 2011-11-26
          • 2016-04-23
          相关资源
          最近更新 更多