首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JSP URL 參數中文亂碼:URL 編碼/解碼完整解決方案

     編輯:程式設計疑難解答

問題現象

瀏覽器地址列輸入 ?name=i6HWE%2B3iQBA%3D,後端 request.getParameter("name") 取得值與預期不符。

根本原因

  • %2B = +,%3D = =
  • 參數值實為 Base64 編碼字串,含特殊字元 + = /
  • Tomcat 預設 ISO-8859-1 解碼,導致中文亂碼

解決方案

方案一:前端雙重編碼 (最徹底)

// JavaScript
var param = "原始中文或Base64字串";
var encoded = encodeURIComponent(encodeURIComponent(param)); // 雙重編碼
location.href = "page.jsp?name=" + encoded;

方案二:後端統一 UTF-8 解碼 (推薦)

<%@ page pageEncoding="UTF-8" %>
<%
    // Tomcat 8+ 需在 server.xml 設定 URIEncoding="UTF-8"
    // 或使用 Filter 統一處理
    String name = request.getParameter("name");
    if (name != null) {
        // 若前端單次編碼,這裡需解碼
        name = java.net.URLDecoder.decode(name, "UTF-8");
    }
%>

方案三:Filter 全域攔截解碼 (生產環境標準)

@WebFilter("/*")
public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");
        
        // 包裝 Request 統一處理 GET 參數
        chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest)req) {
            public String getParameter(String name) {
                String value = super.getParameter(name);
                if (value != null) {
                    try {
                        return URLDecoder.decode(value, "UTF-8");
                    } catch (Exception e) { return value; }
                }
                return null;
            }
        }), res);
    }
}

線上編碼測試工具

站長工具 - URL 編碼/解碼測試

編碼對照表

字元URL 編碼Base64 中含義
空格%20 或 +-
+%2B第 62 個字元
=%3D填充字元
/%2F第 63 個字元
中文%E4%B8%AD%E6%96%87-

最佳實務

  1. 前端統一 encodeURIComponent (單次)
  2. Tomcat server.xml 設定 URIEncoding="UTF-8"
  3. JSP 頁面指令 pageEncoding="UTF-8"
  4. 全域 Filter 兜底處理
  5. Base64 傳輸建議改用 POST Body 或自定義 Header
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved