1. 程式人生 > >SpringMVC的POST和GET亂碼規範解決

SpringMVC的POST和GET亂碼規範解決

POST亂碼

  • 方法:在web.xml新增post亂碼filter
<filter>
<filter-name>CharacterEncodingFilter</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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

以上可以解決post請求亂碼問題。

GET亂碼

  • GET亂碼產生原因是:編碼會經歷兩次編碼,第一次瀏覽器會把不是ASCll碼的字元編碼成ASCll碼,常規瀏覽器會通過GBK2312或者UTF-8來對引數進行編碼(通常按照本頁編碼方式編碼GET引數,谷歌瀏覽器和其它瀏覽器是這個規範,但是IE就不是了,它是按照系統的編碼,所以在大陸一直都是GBK2312編碼),第二次都是統一按照ISO8859-1編碼成0101011等位元組流進行傳輸,所以如果要得到原始資料,伺服器端會進行兩次解碼,第一次統一的,按照ISO8859-1解碼,而我們Tomcat第二次預設也是(ISO8859-1)解碼(通常我們可以在conf下的server.xml中設定預設編碼)。最終原因就是因為瀏覽器第一次編碼和Tomcat第二次解碼方式不一樣,才會產生亂碼。

對於get請求中文引數出現亂碼解決方法有兩個:

修改tomcat配置檔案新增編碼與工程編碼一致,如下:

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

另外一種方法對引數進行重新編碼:

String userName new = String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat預設編碼,需要將tomcat編碼後的內容按ISO8859-1解碼,之後按utf-8編碼,就會得到正確字元。

但是這些操作的前提是,客戶端的編碼必須統一為UTF-8編碼,所以我們要手動通過js把字元編碼成UTF-8碼(瀏覽器會把不是ASCll字元編碼通過編碼轉換成ASCll碼,所以通過我們手動UTF-8編碼後,這個時候的字元就是ASCll碼了,瀏覽器不會再重複編碼,之後就能夠編碼成ISO8859-1的位元組流進行傳輸了)。

通常通過js的UrlEncodeComponent(接受字串)進行UTF-8編碼。

參考連結: