URL 參數值若包含 / + = & % # 等特殊字元(如 Base64 密文),直接拼接會導致參數截斷或錯誤。本文詳細說明編碼/解碼正確姿勢與常見坑點。
String cipher = "za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g=="; // 直接拼接 String url = "https://api.example.com?param=" + cipher; // 伺服端接收到的 param 變為: // "za4T8MHB/6mhmYgXB7IntyyOUL7Cl 0jv5rFxAIFVji8GDrcf k8g==" // + 被解析為空格,/ 被誤判為路徑分隔
URLEncoder.encode(value, "UTF-8")URLDecoder.decode(param, "UTF-8")// 客戶端
String url = "https://api.example.com?param=" + URLEncoder.encode(cipher, "UTF-8");
// 伺服端
String param = request.getParameter("param");
String original = URLDecoder.decode(param, "UTF-8");
// ✅ 正確
String q = "random word 攏500 bank $";
String url = "https://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");
// ❌ 錯誤:編碼整個 URL,破壞 ? & = 結構
String bad = URLEncoder.encode("https://example.com/query?q=value", "UTF-8");
// ❌ 錯誤:編碼 param=value 整體
String bad2 = URLEncoder.encode("param=value", "UTF-8");
原因: & 分隔參數,= 分隔鍵值,編碼後伺服端無法解析。
| 函數 | 用途 | 編碼範圍 |
|---|---|---|
encodeURIComponent() | 編碼參數值 | 除字母數字 - _ . ! ~ * ' ( ) 外全部 |
encodeURI() | 編碼完整 URL | 保留 ; , / ? : @ & = + $ # 等結構字元 |
escape() | 已棄用 | 不支援 Unicode 完整編碼 |
前端傳參請使用 encodeURIComponent(value),後端 Java URLDecoder.decode 完美對應。
Spring MVC @RequestParam、@PathVariable 會自動解碼,無需手動 decode。若雙重解碼會導致 % 變為 %25 等錯誤。
@PathVariable)含特殊字元需在前端 encodeURIComponent,後端自動解碼。Cookie 類建構子會自動處理部分字元。參考權威文檔:What every web developer must know about URL encoding
掌握「只編碼值」原則,URL 參數傳輸零故障。