瀏覽器地址列輸入 ?name=i6HWE%2B3iQBA%3D,後端 request.getParameter("name") 取得值與預期不符。
%2B = +,%3D = =+ = /// JavaScript
var param = "原始中文或Base64字串";
var encoded = encodeURIComponent(encodeURIComponent(param)); // 雙重編碼
location.href = "page.jsp?name=" + encoded;
<%@ 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");
}
%>
@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 編碼 | Base64 中含義 |
|---|---|---|
| 空格 | %20 或 + | - |
| + | %2B | 第 62 個字元 |
| = | %3D | 填充字元 |
| / | %2F | 第 63 個字元 |
| 中文 | %E4%B8%AD%E6%96%87 | - |
encodeURIComponent (單次)server.xml 設定 URIEncoding="UTF-8"pageEncoding="UTF-8"