欢迎光临千百叶网
详情描述

1. 修改 server.xml

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-8
  • useBodyEncodingForURI="true":对 GET 参数使用与 POST 相同的编码

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 测试验证配置效果
相关帖子
全国统一的医保信息平台建成后,对参保人日常使用带来哪些便利?
全国统一的医保信息平台建成后,对参保人日常使用带来哪些便利?
养老保险个人账户和统筹账户的区别,对个人养老金有什么影响?
养老保险个人账户和统筹账户的区别,对个人养老金有什么影响?
民事诉讼的时效是多久,如果超过时效起诉会有什么后果?
民事诉讼的时效是多久,如果超过时效起诉会有什么后果?
2026年各地生育津贴的发放标准是否有统一规定,还是会存在地区差异?
2026年各地生育津贴的发放标准是否有统一规定,还是会存在地区差异?
工作中突发疾病被送往医院,需要满足什么条件才能成功申请工伤认定?
工作中突发疾病被送往医院,需要满足什么条件才能成功申请工伤认定?
射阳县住房抵押贷款公司&私人车辆抵押贷款押绿本|办理大额银行贷款
射阳县住房抵押贷款公司&私人车辆抵押贷款押绿本|办理大额银行贷款
滨州市阳信县房屋装修银行贷款-个人房产贷款公司,公司信用贷款
滨州市阳信县房屋装修银行贷款-个人房产贷款公司,公司信用贷款
仁怀市私人周转借款@车辆抵押贷款办理门店-住房贷款代办电话
仁怀市私人周转借款@车辆抵押贷款办理门店-住房贷款代办电话
惠州市本地垫资过桥公司#公寓银行抵押贷款-汽车抵押贷款当天放款
惠州市本地垫资过桥公司#公寓银行抵押贷款-汽车抵押贷款当天放款
未来,共享经济和租赁服务的普及将如何改变我们的错峰消费逻辑?
未来,共享经济和租赁服务的普及将如何改变我们的错峰消费逻辑?
池州市车辆抵押经营贷#押车大本贷款,抵押贷款服务
池州市车辆抵押经营贷#押车大本贷款,抵押贷款服务
洛阳市孟津区全款房子抵押贷款-房子抵押银行贷款,附近银行信贷
洛阳市孟津区全款房子抵押贷款-房子抵押银行贷款,附近银行信贷
无锡市滨湖区房屋一押二押银行贷款&房产贷款门店办理,贷款中介公司
无锡市滨湖区房屋一押二押银行贷款&房产贷款门店办理,贷款中介公司
葫芦岛市住房公积金信用贷款代办@房屋抵押贷款怎么办理-汽车押车贷款
葫芦岛市住房公积金信用贷款代办@房屋抵押贷款怎么办理-汽车押车贷款
贵港市报废车辆回收公司电话&小轿车回收,高价上门回收,诚信经营
贵港市报废车辆回收公司电话&小轿车回收,高价上门回收,诚信经营
海口市房屋抵押贷款放款快&私家车借款|公司抵押银行贷款
海口市房屋抵押贷款放款快&私家车借款|公司抵押银行贷款
贺州市车辆抵押车大本贷款#汽车抵押贷款办理押本不押车|抵押贷款办理
贺州市车辆抵押车大本贷款#汽车抵押贷款办理押本不押车|抵押贷款办理
开封市兰考县房抵贷代办公司-房屋抵押贷款流程,办理小额银行信用贷款
开封市兰考县房抵贷代办公司-房屋抵押贷款流程,办理小额银行信用贷款
沧州市专业办理房抵贷@房子抵押银行贷款-小额信用贷款
沧州市专业办理房抵贷@房子抵押银行贷款-小额信用贷款