在 conf/server.xml 中修改 Connector 配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" <!-- 关键参数 -->
useBodyEncodingForURI="true" />
参数说明:
URIEncoding="UTF-8":设置 URI 编码为 UTF-8useBodyEncodingForURI="true":对 GET 参数使用与 POST 相同的编码在 web.xml 中添加过滤器(推荐方式):
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在每个 JSP 页面头部添加:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
或在 HTML 中:
<meta charset="UTF-8">
在 Servlet 中处理请求前设置:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
<!-- conf/server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
URIEncoding="UTF-8"
relaxedQueryChars="[]|{}^\`"<>"
relaxedPathChars="[]|"
useBodyEncodingForURI="true" />
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 默认字符集 -->
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>zh_CN</locale>
<encoding>UTF-8</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
</web-app>
创建测试页面 test.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<title>UTF-8 测试</title>
<meta charset="UTF-8">
</head>
<body>
<h2>GET 参数测试</h2>
<form action="test.jsp" method="get">
输入中文:<input type="text" name="input" value="<%= request.getParameter("input") != null ? request.getParameter("input") : "" %>">
<input type="submit" value="提交">
</form>
<%
String input = request.getParameter("input");
if (input != null) {
%>
<h3>接收到的参数:</h3>
<p>原始值:<%= input %></p>
<p>字节长度:<%= input.getBytes("UTF-8").length %></p>
<p>字符长度:<%= input.length() %></p>
<%
}
%>
</body>
</html>
<!-- 在 server.xml 中添加 -->
relaxedQueryChars="[]|{}^\`"<>"
URLEncoder.encode("中文", "UTF-8") 编码 URL
如果使用多个端口,确保所有 Connector 都配置了:
<Connector port="8080" URIEncoding="UTF-8" ... />
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" ... />
创建测试 Servlet:
@WebServlet("/testEncoding")
public class EncodingTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String param = request.getParameter("test");
PrintWriter out = response.getWriter();
out.println("参数值: " + param);
out.println("字节数组: " + Arrays.toString(param.getBytes("ISO-8859-1")));
out.println("正确解码: " + new String(param.getBytes("ISO-8859-1"), "UTF-8"));
}
}
访问:http://localhost:8080/your-app/testEncoding?test=中文
URIEncoding="UTF-8"
推荐使用过滤器统一处理编码
JSP/Servlet 显式设置编码
客户端确保使用 UTF-8 编码 URL
测试验证配置效果