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

Struts2 中文亂碼終極解決方案:Filter + 配置全鏈路覆蓋

     編輯:Java 相關知識

亂碼產生根因

Struts2 處理請求流程:Tomcat 接收請求 → Filter 鏈 → Struts2 FilterDispatcher → Action。若任一環節編碼不一致,即產生亂碼。常見點:

  1. Tomcat 默認 ISO-8859-1 解碼 URL/參數
  2. JSP 頁面 pageEncoding 與瀏覽器提交編碼不匹配
  3. Struts2 內部默認編碼非項目編碼
  4. 數據庫連接字符串未指定 characterEncoding

完整解決方案(以 GBK 為例,UTF-8 同理)

1. 編碼過濾器(最優先執行)

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() {}
}

2. web.xml 配置(順序關鍵:編碼 Filter → Struts Cleanup → Struts2 Filter)

<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>

3. JSP 頁面聲明編碼

<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

4. struts.xml 設置默認編碼

<struts>
    <constant name="struts.i18n.encoding" value="GBK" />
    <!-- 其他配置 -->
</struts>

5. 數據庫連接編碼(MySQL 為例)

<property name="url" value="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK&zeroDateTimeBehavior=convertToNull" />

UTF-8 專項注意事項

  • Tomcat 8+ 默認 UTF-8,但 server.xml 建議顯式配置:<Connector URIEncoding="UTF-8" />
  • 所有層統一 UTF-8:Filter、JSP、struts.xml、DB URL、Java 文件編碼(IDE 設置)、數據庫表字符集。
  • 前端表單:<form accept-charset="UTF-8">,AJAX 設置 contentType: "application/x-www-form-urlencoded; charset=UTF-8"。

驗證清單

  1. 瀏覽器提交中文參數 → Action 接收正常
  2. Action 返回中文 → JSP 顯示正常
  3. 數據庫讀寫中文 → 無亂碼
  4. 文件上傳文件名中文 → 無亂碼(需 Commons FileUpload 支持)

總結

中文亂碼本質是編碼不一致。解決核心:全鏈路統一編碼。按順序:Filter 設置 request/response 編碼 → JSP pageEncoding → Struts2 常量 → 數據庫連接 → 前端表單。遵循此清單,99% 亂碼問題可徹底解決。

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