我在获取以 UTF-8
编码的请求查询参数时遇到问题
请求网址
本地主机:8080/page?searchKey=%D9%85
查询字符串参数
搜索关键字:m
当尝试通过此代码获取此请求的参数时:
String searchKey=((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()).getParameter("searchKey");
if (!StringUtil.isEmpty(searchKey)) {
try {
System.out.println("SearchKey--------Before-------------------"+searchKey);
searchKey=URLDecoder.decode(searchKey, "UTF-8");
} catch (UnsupportedEncodingException ex) {
}
System.out.println("SearchKey---------------------------" + searchKey);
}
这两个system.out
打印以下内容:
搜索关键字--------之前------------------�?//一个正方形
搜索关键字----------之后-----------------�?//一个正方形
所以我需要捕获 :%D9%85 值,该值是请求将其解码为 UTF-8
那么如何做到这一点
我可以从 ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()).getQueryString()
获取它,但这将是一项巨大的工作,是否有另一种方法来获取此编码的 utf 参数
提示:使用的语言是阿拉伯语
最佳答案
HttpServletRequest#getParameter()
提供的请求参数(以及它的 JSF flavor 外观 ExternalContext#getRequestParameterMap()
,您实际上应该使用它,而不是用 javax.servlet.*
工件污染您的 JSF beans,或者更好的是 @ManagedProperty
或 <f:viewParam>
,但除此之外)已经了由容器解码。您不需要将它们传递给 URLDecoder
再次。如果您想获取原始参数以便自己解码它们,那么您确实应该使用 HttpServletRequest#getQueryString()
相反,您自己解析参数名称-值对。
在您的特定情况下,容器似乎使用错误的编码来解码查询字符串参数。大多数容器确实天真地默认为 HTTP 1.1 强制要求的 ISO-8859-1,而这实际上已经不是这个十年的事了。
因此,基本上,您需要明确告诉容器使用 UTF-8 来解码查询字符串参数。不幸的是,您没有告诉任何地方您正在使用哪个容器,所以我无法详细回答。我假设 Tomcat 作为一般示例:您需要编辑其 /conf/server.xml
添加URIEncoding
属性为<Connector>
值为 UTF-8
的元素.
<Connector ... URIEncoding="UTF-8" />
如果您使用不同的容器,只需使用您刚刚从该答案中了解到的新关键字查阅其文档即可。
关于java - 获取请求的 UTF-8 JSF 编码参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244626/