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

Servlet 獲取 JSP 超連結中文參數亂碼完整解決方案

     編輯:程式設計綜合問答

問題現象

在 Tomcat 7.0 環境下,JSP 頁面以超連結傳遞中文參數,Servlet 接收後出現亂碼。已嘗試設定 JSP、Servlet、server.xml 均為 UTF-8,並使用 `new String(str.getBytes("ISO-8859-1"), "UTF-8")` 轉碼,問題依舊。

根本原因

Tomcat 7 預設 URI 編碼為 ISO-8859-1,GET 請求的查詢字串在到達 Servlet 前已被容器按此編碼解析。單純在應用層轉碼無效,必須在容器層面指定 URI 編碼。

完整解決步驟

1. 修改 server.xml 的 Connector 設定

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true" />

2. JSP 頁面編碼宣告

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

3. Servlet 統一設定請求編碼(針對 POST)

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // GET 請求靠 URIEncoding,這裡無需再設定
        String param = req.getParameter("param");
        // 直接使用 param 即可
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8"); // POST 必須手動設定
        // ...
    }
}

4. 避免雙重編碼錯誤

切勿在 Servlet 中再次手動轉碼(如 `new String(...)`),這會導致已正確解碼的字串再次被破壞。

驗證方法

在瀏覽器開發者工具 Network 分頁查看 Request URL,確認中文參數已正確 URL 編碼(如 `%E4%B8%AD%E6%96%87`),且 Servlet 直接 `getParameter` 即可獲得正確字串。

補充:過濾器統一處理

若專案較大,建議編寫一個 `CharacterEncodingFilter` 統一設定請求/回應編碼,並在 `web.xml` 中映射到 `/*`。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved