The requested resource (/MIS/%E4%B8%BB%E9%A2%98%E5%A4%B4%E5%83%8F%E7%BD%91%E9%A1%B5.jsp) is not available.
%E4%B8%BB%E9%A2%98%E5%A4%B4%E5%83%8F%E7%BD%91%E9%A1%B5 是 主題頭像網頁 的 **UTF-8 URL 編碼**形式。錯誤訊息顯示伺服器嘗試尋找該路徑但失敗,核心原因通常是:**Tomcat 預設以 ISO-8859-1 解碼 URL 路徑,導致中文路徑解析錯誤**。
%E4%B8%BB...)。URIEncoding="UTF-8"**,但舊版或特定配置下可能使用 ISO-8859-1 解碼,導致 %E4%B8%BB 被誤解為三個獨立字元而非一個中文字。| 方案 | 適用場景 | 配置位置 | 優點 | 缺點 |
|---|---|---|---|---|
| Tomcat 全域 URIEncoding | 全專案、根治 | server.xml <Connector> | 一次設定、無代碼入侵、效能最佳 | 需重啟 Tomcat、影響所有 Webapp |
| Filter 統一編碼 | 無法修改 server.xml、共享主機 | web.xml 註冊 Filter | 專案級隔離、可同時處理 POST/GET | 需確保 Filter 為第一個、略增開銷 |
| 手動轉碼 | 臨時修復、特定 Servlet | Java 代碼中 | 靈活控制 | 易漏、維護困難、不推薦 |
<!-- conf/server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
URIEncoding="UTF-8":指定 **GET 請求 URL 路徑/查詢字串** 的解碼字元集。useBodyEncodingForURI="true":若 URIEncoding 未設定,回退使用請求主體編碼(POST 表單通常為 UTF-8)。// web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
關鍵:forceEncoding=true 強制覆蓋請求/回應編碼,**必須註冊為第一個 Filter**。
// 獲取原始查詢字串(Tomcat 以 ISO-8859-1 解碼後的錯誤字串)
String wrong = request.getParameter("param");
// 逆向還原:先以 ISO-8859-1 編碼回位元組,再以 UTF-8 解碼
String correct = new String(wrong.getBytes("ISO-8859-1"), "UTF-8");
此法依賴 Tomcat 確實用 ISO-8859-1 解碼,若已設定 UTF-8 反而會雙重編碼導致亂碼。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
pageEncoding:JSP 檔案本身儲存編碼(IDE 儲存時)。contentType:回應 HTTP Header Content-Type: text/html;charset=UTF-8。<meta charset>:瀏覽器解碼 HTML 內容依據。CHARSET=utf8mb4,連線字串 characterEncoding=utf8。URIEncoding="UTF-8"。CharacterEncodingFilter 設定 forceEncoding=true。pageEncoding="UTF-8"、contentType="...UTF-8"、<meta charset="UTF-8">。contentType: 'application/json;charset=UTF-8',Form accept-charset="UTF-8"。// 在 Filter 或 Servlet 早期印出實際編碼
System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
System.out.println("request.getParameter('name') = " + request.getParameter("name"));
// 觀察控制台輸出是否為預期中文
JSP 中文路徑 404 核心在於 **Tomcat URL 解碼字元集不匹配**。**首選方案:修改 server.xml 設定 URIEncoding="UTF-8"**,一勞永逸。若無法修改伺服器配置,部署 CharacterEncodingFilter 並確保順序最前。建立完整 UTF-8 編碼鏈路(DB → Java → Tomcat → JSP → 瀏覽器)才能徹底杜絕亂碼問題。