1. 程式人生 > >【java web】JSP中form表單中文亂碼的解決嘗試

【java web】JSP中form表單中文亂碼的解決嘗試

       在人生中的第一個實際專案中,我遇到了一個很困擾的問題,就是在內管系統中,我做了一個測試頁面,用來測試向對方介面傳遞引數,我使用了jsp的form表單向後端傳遞引數,在本地啟動服務,進行測試都沒有問題,沒有出現中文亂碼的情況,但是提交到測試環境進行驗證時,卻出現了亂碼的情況,就像這樣:

中文亂碼問題1
圖1. 頁面上輸入後返回的中文亂碼

       作為新手,廢話不多說,打log,看問題出在哪裡。

       我的日誌打在兩個地方,一:接收前端form表單傳遞的引數時;二:處理後返回給前端做回顯時。日誌結果如下:

前端form表單傳遞的NAME值
圖2.1 標題接收前端form表單傳遞的引數
後端返給前端的NAME
圖2.2 處理後返回給前端做回顯

       顯然,後端接收到的引數就是亂碼的,所以問題並不是後端的處理。那麼傳遞引數亂碼的原因是什麼呢?為什麼本地起服務測試後,就沒有問題,而在測試環境中這個問題就會暴露出來?

       原來是和我們測試環境的tomcat的配置有關係,在<Connector>標籤內並沒有加註編碼方式,導致tomcat處理的引數都使用了ISO-8859-1,中文傳遞的時候是亂碼也就不奇怪了。

tomcat配置
tomcat的配置

       作為一個小白,當然是不能輕易去動環境中的配置,於是我採用了【Filter+Controller】的方式進行修改。

       首先,在web.xml中新增如下配置資訊:

<filter>
    <filter-name>encoding-filter</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>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

       這個過程是引入filter.CharacterEncodingFilter,並將過濾器的作用範圍定義為全域性。

       然後將control層接收前端返回的引數的方式改為HttpServletRequest,並通過getParameter()接收引數,程式碼如下:

public ModelAndView test(HttpServletRequest request){
    String name = request.getParameter("name");
    ...........
}

       這樣就解決了這次的中文亂碼的問題。