如何在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中的那些scriptlet 。 request.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工作得很好