如何在Tomcat中设置请求编码?
Posted
技术标签:
【中文标题】如何在Tomcat中设置请求编码?【英文标题】:How to set request encoding in Tomcat? 【发布时间】:2011-10-16 03:26:03 【问题描述】:我的 Java webapp 有问题。
这是 index.jsp 中的代码:
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="index.jsp" method="get">
<input type="text" name="q"/>
</form>
Res: <%= request.getParameter("q") %>
</body>
</html>
当我对请求进行wireshark 时,我的浏览器会发送此标头:
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");
但是,如果我发送这个网址:
http://localhost:8080/kjd/index.jsp?q=%E9
“%E9”使用 ISO-8859-1 解码并显示“é”。
为什么这不起作用?为什么使用 ISO-8859-1 对请求进行解码?
我已经在 Tomcat 6 和 7 以及 Windows 和 Ubuntu 上尝试过。
【问题讨论】:
This apache wiki page 可以帮助你;运行它以查看是否可以进行任何更改。 【参考方案1】:request.setCharacterEncoding("UTF-8");
只设置请求 body 的编码(用于 POST 请求),而不设置请求 URI 的编码(已被GET 请求使用)。
您需要在Tomcat 的/conf/server.xml
的<Connector>
元素中将URIEncoding
属性设置为UTF-8
,以使Tomcat 将请求URI(和查询字符串)解析为UTF-8。这确实默认为 ISO-8859-1。另请参阅Tomcat HTTP Connector Documentation。
<Connector ... URIEncoding="UTF-8">
或确保使用与正文相同的编码来解析 URI1:
<Connector ... useBodyEncodingForURI="true">
另见:
Unicode - How to get the characters right? - JSP/Servlet request1来自Tomcat's documentation(强调我的):
提供此设置是为了与 Tomcat 4.1.x 兼容,其中 在 contentType 中指定的编码,或使用显式设置 Request.setCharacterEncoding 方法也用于参数 从网址。默认值为 false。
请删除您的 JSP 中的那些 scriptlet。 request.setCharacterEncoding("UTF-8");
在错误的时刻被调用。每当您正确使用 Servlet 来处理请求时,都为时已晚。您宁愿为此使用filter。 response.setCharacterEncoding("UTF-8");
部分已经由 JSP 顶部的 pageEncoding="UTF-8"
隐式完成。
我还 strongly recommend 将老式的 <%= request.getParameter("q") %>
scriptlet 替换为 EL $param.q
,或者用 JSTL XML 转义 $fn:escapeXml(param.q)
以防止 XSS attacks。 p>
【讨论】:
请注意,并非所有浏览器都乐意发送 UTF-8 查询参数,看你的 IE :blogs.msdn.microsoft.com/ieinternals/2014/04/22/…【参考方案2】:您只需取消注释 conf/web.xml(Tomcat 服务器 web.xml
)中过滤所有请求并转换为 UTF-8 的代码部分。
<!-- A filter that sets character encoding that is used to decode -->
<!-- parameters in a POST request -->
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- The mapping for the Set Character Encoding Filter -->
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就是这样。在tomcat中工作正常
【讨论】:
以上是关于如何在Tomcat中设置请求编码?的主要内容,如果未能解决你的问题,请参考以下文章