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

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年出现的太阳能充电快递柜,其实际节能效果如何?
文山民间借贷平台@汽车抵押企业大额贷款-房产抵押贷款怎么办理
文山民间借贷平台@汽车抵押企业大额贷款-房产抵押贷款怎么办理
宜兴市汽车押绿本借款#汽车不押车贷款,个人生意银行信用贷款
宜兴市汽车押绿本借款#汽车不押车贷款,个人生意银行信用贷款
临时委托他人照顾家中年迈老人,应该注意哪些重要的法律和照护细节?
临时委托他人照顾家中年迈老人,应该注意哪些重要的法律和照护细节?
延安市抵押车子大本借款#车辆抵押贷款押车|附近银行信贷
延安市抵押车子大本借款#车辆抵押贷款押车|附近银行信贷
连云港市灌云县房抵贷办理&房子抵押贷款门店,银行贷款咨询
连云港市灌云县房抵贷办理&房子抵押贷款门店,银行贷款咨询
恩施网站运营&精准获客系统,服务可靠
恩施网站运营&精准获客系统,服务可靠
荔浦市二手房抵押银行贷款&汽车绿本抵押企业贷款|企业创业担保贷款代办公司
荔浦市二手房抵押银行贷款&汽车绿本抵押企业贷款|企业创业担保贷款代办公司
洛阳市房子红本银行抵押贷款@个人房产银行抵押贷款-债务重组
洛阳市房子红本银行抵押贷款@个人房产银行抵押贷款-债务重组
未来小区的立体停车库或机械停车设备,其维护成本与可靠性如何?
未来小区的立体停车库或机械停车设备,其维护成本与可靠性如何?
德州市马桶疏通电话|下水道疏通,本地商家上门疏通
德州市马桶疏通电话|下水道疏通,本地商家上门疏通