項目使用了 SiteMesh 裝飾器框架。SiteMesh 在處理頁面佈局時,可能未正確傳遞或設置響應字符編碼,導致正文部分(由裝飾器合併輸出)編碼錯誤,而直接輸出的菜單/標題不受影響。
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, res);
}
// init/destroy 略
}
在 web.xml 中註冊為第一個過濾器:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.example.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<%@ page contentType="text/html;charset=UTF-8" %>。characterEncoding=UTF-8。server.xml 的 <Connector> URIEncoding="UTF-8"。框架級組件(如 SiteMesh)可能繞過常規編碼設置,導致局部亂碼。全局過濾器強制統一請求/響應編碼是通用且徹底的修復手段,兼容各類容器部署環境差異。