首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

解決 Java Web 中文亂碼:Filter 統一編碼過濾器完整實作

     編輯:Java 綜合教學

Java Web 中文亂碼徹底解決:Filter 統一編碼過濾器

在 Java Web 開發中,前台傳遞中文參數到後台常出現亂碼。雖可在 Controller 逐一轉碼,但維護成本高。使用 Filter 統一攔截請求、設定編碼,是標準最佳實務。

一、Filter 核心概念

  • 生命週期:init()(啟動一次)→ doFilter()(每請求執行)→ destroy()(關閉一次)
  • FilterChain:呼叫 chain.doFilter(req, resp) 將請求傳遞給下一個 Filter 或目標資源
  • 攔截路徑:在 web.xml 配置 <url-pattern>

二、字符編碼過濾器實作

package com.cn.imooc.filter;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class SetCharacterEncodingFilter implements Filter {

    private String encoding;

    @Override
    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("encoding");
        if (encoding == null || encoding.isEmpty()) {
            encoding = "UTF-8";
        }
        System.out.println("字符編碼過濾器初始化,編碼:" + encoding);
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        // 統一設定請求與回應編碼
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        // 可選:設定 Content-Type
        response.setContentType("text/html;charset=" + encoding);

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 釋放資源
    }
}

三、web.xml 註冊與配置

<!-- 字符編碼過濾器 -->
<filter>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <filter-class>com.cn.imooc.filter.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <url-pattern>*.action</url-pattern> <!-- 攔截所有 .action 結尾請求 -->
</filter-mapping>

四、關鍵說明

  1. init-param 讓編碼可配置,預設 UTF-8
  2. url-pattern 可改為 /* 攔截所有請求,但需注意靜態資源
  3. Spring MVC 專案建議使用框架內建的 CharacterEncodingFilter(功能相同,整合更好)
  4. Tomcat 8+ 可在 server.xml 設定 URIEncoding="UTF-8" 解決 GET 請求亂碼

五、原理圖解

Filter 處理流程圖

請求必須通過 Filter 鏈才能到達 Servlet/JSP,Filter 可修改請求/回應物件、決定是否繼續傳遞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved