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

解決 Tomcat SSI include JSP 中文亂碼:inputEncoding/outputEncoding 關鍵配置

     編輯:Java 相關知識

現象:`.shtml` 用 `<!--#include virtual="xxx.jsp"-->` 包含 JSP,JSP 輸出中文顯示亂碼。根因:SSI Servlet 預設編碼非 GBK/UTF-8,導致 JSP 輸出被錯誤解碼後再輸出。

解決方案:修改 $TOMCAT/conf/web.xml 的 SSIServlet 定義

<servlet>
    <servlet-name>ssi</servlet-name>
    <servlet-class>org.apache.catalina.ssi.SSIServlet</servlet-class>
    ...
    <init-param>
        <param-name>inputEncoding</param-name>
        <param-value>GBK</param-value>  <!-- 或 UTF-8,與 JSP pageEncoding 一致 -->
    </init-param>
    <init-param>
        <param-name>outputEncoding</param-name>
        <param-value>GBK</param-value> <!-- 輸出編碼同步 -->
    </init-param>
    <load-on-startup>4</load-on-startup>
</servlet>

驗證步驟

  1. 確認 JSP 頁首聲明:`<%@ page contentType="text/html; charset=GBK" pageEncoding="GBK"%>` (或 UTF-8)。
  2. 修改 web.xml 加入上述兩參數,**編碼必須與 JSP 一致**。
  3. 重啟 Tomcat,訪問 `.shtml` 頁面,中文應正常顯示。

原理解析

  • SSI Servlet 讀取 JSP 輸出流時,依 inputEncoding 解碼為字串;輸出瀏覽器時,依 outputEncoding 編碼為位元組。
  • 若 JSP 為 UTF-8 而 SSI 預設 ISO-8859-1 → 中文變 `??` 或亂碼。
  • 同理,若使用 SSIFilter,需在 Filter 同樣配置 inputEncoding/outputEncoding。

最佳實踐建議

  • **全站統一 UTF-8**:JSP、HTML、SSI、資料庫、JS/CSS 檔案編碼全鏈路 UTF-8,徹底杜絕亂碼。
  • 若歷史專案為 GBK,確保 SSI 與 JSP 雙邊同步設為 GBK。
  • 避免在 `.shtml` 中大量包含複雜 JSP,**建議改用 JSP Include (``) 或 Tile/SiteMesh 佈局**,SSI 適合靜態片段 (Header/Footer)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved