义乌市文章资讯

Tomcat接收UTF-8编码的GET参数请求的配置步骤

2026-04-07 23:51:02 浏览次数:2
详细信息

1. 修改 server.xml

conf/server.xml 中修改 Connector 配置:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"  <!-- 关键参数 -->
           useBodyEncodingForURI="true" />

参数说明:

2. 添加字符编码过滤器

在 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>

3. JSP 页面设置

在每个 JSP 页面头部添加:

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

或在 HTML 中:

<meta charset="UTF-8">

4. Servlet 设置

在 Servlet 中处理请求前设置:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

5. 完整配置示例

Tomcat 8+ 优化配置

<!-- conf/server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxParameterCount="1000"
           URIEncoding="UTF-8"
           relaxedQueryChars="[]|{}^\`"<>"
           relaxedPathChars="[]|"
           useBodyEncodingForURI="true" />

web.xml 完整配置

<?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>

6. 测试方法

创建测试页面 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>

7. 常见问题解决

问题1:URL 中的特殊字符

<!-- 在 server.xml 中添加 -->
relaxedQueryChars="[]|{}^\`"<>"

问题2:GET 参数仍然乱码

检查是否重启 Tomcat 确认浏览器 URL 编码正确(Chrome/Firefox 默认 UTF-8) 使用 URLEncoder.encode("中文", "UTF-8") 编码 URL

问题3:多个 Connector 配置

如果使用多个端口,确保所有 Connector 都配置了:

<Connector port="8080" URIEncoding="UTF-8" ... />
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" ... />

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=中文

最佳实践总结:

server.xml 中 Connector 必须配置 URIEncoding="UTF-8" 推荐使用过滤器统一处理编码 JSP/Servlet 显式设置编码 客户端确保使用 UTF-8 编码 URL 测试验证配置效果
相关推荐