如何在Tomcat中设置请求编码?

我的Java webapp中存在问题。

这是index.jsp中的代码:

      JSP Page   

Hello World!

Res:

当我发送请求时,我的浏览器会发送此标头:

 GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n ... Accept-Charset: UTF-8,*\r\n 

Tomcat服务器将此返回给我:

 Content-Type: text/html;charset=UTF-8\r\n 

但是如果我在表格中发送“é”(UTF-8中的%C3%A9),则会显示“é”。

我的理解是浏览器发送一个用UTF-8(%C3%A9)编码的“é”。

但服务器将其解释为ISO-8859-1。 所以%C3被解码为Ã而%A9被解码为©,然后发回以UTF-8编码的响应。

在代码中,请求应使用UTF-8解码:

 request.setCharacterEncoding("UTF-8"); 

但是,如果我发送这个url:

 http://localhost:8080/kjd/index.jsp?q=%E9 

“%E9”用ISO-8859-1表示,显示“é”。

为什么这不起作用? 为什么请求使用ISO-8859-1进行解码?

我在Tomcat 6和7以及Windows和Ubuntu上尝试过它。

request.setCharacterEncoding("UTF-8"); 仅设置请求主体的编码(POST请求已使用),而不是请求URI的编码(GET请求已使用)。

您需要在Tomcat的/conf/server.xml元素/conf/server.xml URIEncoding属性设置为UTF-8 ,以使Tomcat将请求URI(和查询字符串)解析为UTF-8。 这确实默认为ISO-8859-1。 另请参见Tomcat HTTP连接器文档 。

  

或者确保使用与正文相同的编码解析URI:

  

也可以看看:

  • Unicode – 如何使角色正确? – JSP / Servlet请求

请删除JSP中的那些scriptletrequest.setCharacterEncoding("UTF-8"); 在错误的时刻被召唤。 只要您正确使用Servlet处理请求,就太晚了。 你更喜欢使用filter 。 response.setCharacterEncoding("UTF-8"); 部分已经由JSP顶部的pageEncoding="UTF-8"隐式完成。

我还强烈建议用EL ${param.q}替换旧的<%= request.getParameter("q") %> scriptlet ,或者用JSTL XML转义${fn:escapeXml(param.q)}来防止XSS攻击 。

您只需要在conf / web.xml(Tomcat服务器web.xml)中取消注释下面的部分代码,过滤所有请求并转换为UTF-8。

     setCharacterEncodingFilter org.apache.catalina.filters.SetCharacterEncodingFilter  encoding UTF-8     setCharacterEncodingFilter /*  

而已。 在tomcat工作得很好