Struts2 處理請求流程:Tomcat 接收請求 → Filter 鏈 → Struts2 FilterDispatcher → Action。若任一環節編碼不一致,即產生亂碼。常見點:
package util;
import javax.servlet.*;
import java.io.IOException;
public class SetCharacterEncodingFilter implements Filter {
private String encoding = "GBK"; // 可通過 web.xml init-param 配置
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String enc = filterConfig.getInitParameter("encoding");
if (enc != null) encoding = enc;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding); // 同時設置響應編碼
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
<web-app xmlns="https://java.sun.com/xml/ns/javaee" version="2.5">
<!-- 1. 編碼過濾器:最先攔截所有請求 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>util.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 2. Struts2 清理過濾器:清理 ThreadLocal,防止內存洩漏 -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 3. Struts2 核心過濾器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<struts>
<constant name="struts.i18n.encoding" value="GBK" />
<!-- 其他配置 -->
</struts>
<property name="url" value="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK&zeroDateTimeBehavior=convertToNull" />
server.xml 建議顯式配置:<Connector URIEncoding="UTF-8" /><form accept-charset="UTF-8">,AJAX 設置 contentType: "application/x-www-form-urlencoded; charset=UTF-8"。中文亂碼本質是編碼不一致。解決核心:全鏈路統一編碼。按順序:Filter 設置 request/response 編碼 → JSP pageEncoding → Struts2 常量 → 數據庫連接 → 前端表單。遵循此清單,99% 亂碼問題可徹底解決。