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 特殊字符的主要内容,如果未能解决你的问题,请参考以下文章