getParameter 特殊字符

Posted

技术标签:

【中文标题】getParameter 特殊字符【英文标题】:getParameter special characters 【发布时间】: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");

谢谢大家

【问题讨论】:

【参考方案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 参数。您不应该手动执行此操作。

以上是关于getParameter 特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

getParameter 特殊字符

无法解析 JSP 中的方法 getParameter()

request.getAttribute()和request.getParameter()两个方法的区别

URL中的特殊字符

URI 中特殊字符处理

用JSP完成输入整形,单精度浮点数,双精度浮点数