2026/10/26 10:24:17

解决Tomcat应用中文乱码问题:从编码设置到过滤器配置

解决Tomcat应用中文乱码问题:从编码设置到过滤器配置 一、Tomcat应用中文乱码问题概述在开发基于Tomcat的Web应用时中文乱码是一个常见且令人头疼的问题。简单来说当我们在页面上输入中文或者从数据库里读取中文数据显示在页面上时可能会看到一堆乱码而不是正常的中文字符。这不仅影响用户体验还可能导致业务数据出现错误。1.1 应用场景中文乱码问题在很多场景下都会出现。比如我们开发一个在线论坛系统用户在发表帖子时输入中文内容提交后却发现显示的是乱码或者在一个电商系统里商品名称和描述是中文从数据库查询出来显示在网页上时变成了乱码。再比如我们在进行文件上传下载操作时如果文件名称包含中文也可能会出现乱码情况。1.2 技术优缺点优点方面如果能够正确解决中文乱码问题那么我们的应用就可以完美地支持中文提升用户体验让系统更加国际化和友好。但解决这个问题也有一些难点也就是所谓的“缺点”。不同的编码格式之间转换比较复杂而且在不同的环境下如不同的操作系统、浏览器可能会有不同的表现这就增加了问题排查和解决的难度。1.3 注意事项在解决中文乱码问题时要注意各个环节的编码设置要保持一致。比如页面的编码、请求的编码、响应的编码以及数据库的编码等都要统一否则还是会出现乱码。另外不同版本的Tomcat可能在编码设置上有一些细微的差别需要仔细查看官方文档。二、编码设置2.1 Tomcat配置文件编码设置Tomcat的配置文件server.xml是非常重要的我们可以在这里进行一些编码相关的设置。打开server.xml文件找到Connector标签一般会有类似下面这样的配置!-- Java XML技术栈 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /我们需要在这个标签里添加URIEncoding属性将其值设置为UTF-8这样可以解决URL中中文参数的乱码问题。修改后的配置如下!-- Java XML技术栈 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /2.2 JSP页面编码设置在JSP页面中我们需要设置页面的编码。在JSP文件的开头添加以下代码!-- Java JSP技术栈 -- % page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%这里的contentType用于指定响应的内容类型和编码pageEncoding用于指定JSP页面本身的编码。通过这样的设置JSP页面就可以正确处理中文了。2.3 Servlet请求和响应编码设置在Servlet中我们需要对请求和响应的编码进行设置。以下是一个简单的Servlet示例// Java Servlet技术栈 import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; WebServlet(/test) public class TestServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置请求编码 request.setCharacterEncoding(UTF-8); // 设置响应编码 response.setCharacterEncoding(UTF-8); response.setContentType(text/html; charsetUTF-8); // 处理请求和响应 String name request.getParameter(name); response.getWriter().println(你好 name); } }在这个示例中我们通过request.setCharacterEncoding(UTF-8)设置请求的编码通过response.setCharacterEncoding(UTF-8)和response.setContentType(text/html; charsetUTF-8)设置响应的编码。三、过滤器配置3.1 过滤器的作用过滤器可以在请求到达Servlet之前或者响应返回给客户端之前对请求和响应进行处理。对于中文乱码问题我们可以通过编写一个过滤器来统一设置请求和响应的编码避免在每个Servlet中都重复设置编码。3.2 编写编码过滤器以下是一个简单的编码过滤器示例// Java Filter技术栈 import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; WebFilter(/*) public class CharacterEncodingFilter implements Filter { private String encoding; Override public void init(FilterConfig filterConfig) throws ServletException { // 从过滤器配置中获取编码设置 encoding filterConfig.getInitParameter(encoding); if (encoding null) { encoding UTF-8; } } Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 设置请求编码 request.setCharacterEncoding(encoding); // 设置响应编码 response.setCharacterEncoding(encoding); response.setContentType(text/html; charset encoding); // 继续处理请求 chain.doFilter(request, response); } Override public void destroy() { // 过滤器销毁时的操作 } }3.3 配置过滤器在web.xml文件中配置这个过滤器示例如下!-- Java XML技术栈 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classcom.example.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping通过这样的配置所有的请求都会经过这个过滤器统一设置请求和响应的编码。四、综合示例4.1 完整项目示例假设我们有一个简单的Web应用包含一个JSP页面和一个Servlet。JSP页面用于接收用户输入的中文信息Servlet用于处理这个信息并返回结果。JSP页面index.jsp!-- Java JSP技术栈 -- % page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head title中文测试/title /head body form actiontest methodget label forname请输入姓名/label input typetext idname namename input typesubmit value提交 /form /body /htmlServletTestServlet.java// Java Servlet技术栈 import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; WebServlet(/test) public class TestServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应编码 response.setCharacterEncoding(UTF-8); response.setContentType(text/html; charsetUTF-8); // 获取请求参数 String name request.getParameter(name); response.getWriter().println(你好 name); } }过滤器CharacterEncodingFilter.java// Java Filter技术栈 import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; WebFilter(/*) public class CharacterEncodingFilter implements Filter { private String encoding; Override public void init(FilterConfig filterConfig) throws ServletException { encoding filterConfig.getInitParameter(encoding); if (encoding null) { encoding UTF-8; } } Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); response.setContentType(text/html; charset encoding); chain.doFilter(request, response); } Override public void destroy() { // 过滤器销毁时的操作 } }web.xml配置!-- Java XML技术栈 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classcom.example.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping4.2 测试示例将上述代码部署到Tomcat服务器上启动服务器后访问index.jsp页面。在输入框中输入中文姓名点击提交按钮。如果一切配置正确页面将正确显示中文信息不会出现乱码。五、文章总结解决Tomcat应用中文乱码问题需要从多个方面入手包括Tomcat配置文件的编码设置、JSP页面的编码设置、Servlet请求和响应的编码设置以及过滤器的配置。通过统一各个环节的编码我们可以有效地解决中文乱码问题。在实际开发中我们要注意各个环节的编码一致性并且根据不同的场景选择合适的解决方法。同时使用过滤器可以提高代码的复用性避免在每个Servlet中重复设置编码。