在 Java Web 開發中,前台傳遞中文參數到後台常出現亂碼。雖可在 Controller 逐一轉碼,但維護成本高。使用 Filter 統一攔截請求、設定編碼,是標準最佳實務。
init()(啟動一次)→ doFilter()(每請求執行)→ destroy()(關閉一次)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() {
// 釋放資源
}
}
<!-- 字符編碼過濾器 -->
<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>
init-param 讓編碼可配置,預設 UTF-8url-pattern 可改為 /* 攔截所有請求,但需注意靜態資源CharacterEncodingFilter(功能相同,整合更好)server.xml 設定 URIEncoding="UTF-8" 解決 GET 請求亂碼
請求必須通過 Filter 鏈才能到達 Servlet/JSP,Filter 可修改請求/回應物件、決定是否繼續傳遞。