request.getQueryString()似乎需要一些编码

我有一些UTF-8的问题。 我的客户端(以GWT实现)向我的servlet发出一个请求,在URL中有一些参数,如下所示:

http://localhost:8080/servlet?param=value 

当在servlet中检索URL时,我有一些UTF-8字符的问题。 我使用这个代码:

 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String reqUrl = request.getRequestURL().toString(); String queryString = request.getQueryString(); System.out.println("Request: "+reqUrl + "?" + queryString); ... 

所以,如果我打电话给这个url:

 http://localhost:8080/servlet?param=così 

结果是这样的:

 Request: http://localhost:8080/servlet?param=cos%C3%AC 

我能做些什么来正确设置字符编码?

我之前遇到过这个问题。 不知道你正在使用什么Java servlet容器,但至less在Tomcat 5.x(不确定6.x左右)中, request.setCharacterEncoding()方法对GET参数没有影响。 当你的servlet运行的时候,GET参数已经被Tomcat解码了,所以setCharacterEncoding不会做任何事情。

两种方法来解决这个问题:

  1. 将连接器的URIEncoding设置更改为UTF-8。 请参阅http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

  2. 正如BalusC所build议的那样,自己解码查询string,并手动将其parsing(而不是使用ServletRequest API)到自己的参数映射中。

希望这可以帮助!

从HttpServletRequest#getQueryString()javadoc :

返回 :包含查询string的string;如果URL不包含查询string,则返回 null。 该值不被容器解码。

注意最后的声明。 所以你需要使用java.net.URLDecoder 对自己进行URL解码 。

 String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8"); 

但是,收集参数的正常方式是使用HttpServletRequest#getParameter() 。

 String param = request.getParameter("param"); // così 

如果你已经configuration它使用正确的编码,servlet容器已经为你进行了URL解码。 request.setCharacterEncoding()只对请求主体(POST)有效,而不在请求URI(GET)上。 另请参阅幻影的答案。

它真的花了整整一天,但:

 final String param = new String(request.getParameter("param").getBytes( "iso-8859-1"), "UTF-8"); 

另见这里 。 请注意, 如果服务器的解码字符集( URIEncoding在tomcat中)是iso-8859-1 ,那么这是有效的,否则这个字符集必须被传入。例如,如何从Tomcat 7的server.xml获取URIEncoding字符集看到我引用的答案

对于POST请求,我接下来解决了这个问题。

  1. 在server.xml中为连接器设置URIEncoding =“UTF-8”attr; (我使用Tomcat 8)
  2. 在参数检索前设置request.setCharacterEncoding(“UTF-8”)。

最后,我得到了正确的utf-8字符deliery:例如String name = request.getParameter(“name”);

名称包含正确的utf-8string。

http请求params编码有很多因素影响。 你可以参考这个问题的顺序指南。

1.检查你的表单的接受字符编码。

 <form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8"> 

2.检查http服务器的默认字符编码值。 在apache http服务器的情况下,向httpd.conf文件添加"AddDefaultCharset UTF-8"string。

3.如果您有后端服务器,请检查后端服务器的字符编码值。 在tomcat后端服务器的情况下,将“URIEncoding =”UTF-8“属性添加到您的连接器。例如,

 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 

为http请求参数编码问题提供指导

 pRes.setContentType("text/html; charset=UTF-8"); PrintWriter out = new PrintWriter(new (pRes.getOutputStream(), "UTF8"), true); 

使用上面的代码,我得到了预期的结果:)