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

时间:2010-06-12 16:51:41

标签: servlets utf-8 character-encoding query-string

我对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);
        ...

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

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

结果如下:

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

如何正确设置字符编码?

5 个答案:

答案 0 :(得分:29)

来自HttpServletRequest#getQueryString() javadoc

  

<强>返回:   包含查询字符串的String;如果URL不包含查询字符串,则返回null。 容器不会解码该值。

请注意最后一句话。所以你需要URL-decode使用java.net.URLDecoder。{/ p>

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

但是,收集参数的常规方法是使用HttpServletRequest#getParameter()

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

如果您已将servletcontainer配置为使用正确的编码,则servletcontainer已经为您进行了URL解码。 request.setCharacterEncoding()仅对请求主体(POST)有效,而不对请求URI(GET)有影响。另见Mirage的答案。

答案 1 :(得分:27)

之前我遇到过同样的问题。不确定你正在使用什么Java servlet容器,但至少在Tomcat 5.x中(不确定6.x)request.setCharacterEncoding()方法对GET参数没有影响。当您的servlet运行时,Tomcat已经解码了GET参数,因此setCharacterEncoding将不会执行任何操作。

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

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

  2. 正如BalusC建议的那样,自己解码查询字符串,然后自己将其解析(而不是使用ServletRequest API)到参数图中。

  3. 希望这有帮助!

答案 2 :(得分:20)

这真的花了一整天但是:

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

另见here。请注意,这是有效的 iff 服务器的解码字符集(tomcat中的URIEncoding)是iso-8859-1 - 否则必须传入此字符集。有关如何获取的示例来自Tomcat 7的URIEncoding的{​​{1}}字符集请参阅我引用的answer

答案 3 :(得分:3)

对于POST请求,我下一步解决了问题。

  1. 设置URIEncoding =&#34; UTF-8&#34;用于Connector的server.xml中的attr; (我使用Tomcat 8)
  2. 在参数检索之前设置request.setCharacterEncoding(&#34; UTF-8&#34;)。
  3. 最后,我有正确的utf-8字符: 例如String name = request.getParameter(&#34; name&#34;);

    name包含正确的utf-8字符串。

答案 4 :(得分:1)

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

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

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

2.检查http服务器的默认字符编码值。 对于apache http server,将"AddDefaultCharset UTF-8"字符串添加到httpd.conf文件。

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

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

...

guide for http request parameter encoding problems