IT兄弟連 JavaWeb教程 Servlet表單亂碼問題

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/ITXDL123/article/details/90089726

在使用原生的Servlet進行Web應用開發時經常會遇到一些中文亂碼問題,造成亂碼問題的原因只有一個:即客戶端與服務端的字元編碼不一致所導致的。

請求參數亂碼問題

伺服器端獲取客戶端傳遞過來的數據出現亂碼的問題(即使用get獲取post向伺服器發送請求時出現亂碼):

get與post請求的亂碼處理時不一致的,當get請求時,其傳遞給伺服器的數據時附加在URL地址之後的;而post的請求時,其傳遞給伺服器的數據是作為請求正文傳遞給伺服器。

● post請求的亂碼處理:

用戶在表單中填寫的內容在請求正文中被提交給Servlet。當我們在表單中輸入中文是,Servlet的request的編碼與客戶端不一致,則伺服器無法解析,就會出現亂碼。解決方法是改變請求正文中的字元編碼(對於get請求無效,因為get提交表單的數據在URL中),方法如下:

request.setCharacterEncoding("UTF-8");

● get請求的亂碼處理:

在伺服器端獲取get請求的參數時,可以使用String類的另外一個構造函數,這個構造函數可以指定字元串的編碼形式。方法如下:

String username = request.getParameter("username");

username = new String(username.getBytes("ISO-8859-1"),"UTF-8");

get請求亂碼問題還可以使用另外一種方法來解決,就是修改Tomcat默認的編碼方式,方法如下:

在Tomcat的安裝目錄下,找到conf文件夾下的server.xml文件並打開,找到其中如下的程式碼:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

在Connector元素中添加URIEncoding屬性,並將屬性值修改為UTF-8,詳情如下:

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

響應數據亂碼問題

在Servlet編程中,經常需要通過response對象將一些資訊返回給瀏覽器給我們的客戶端,而我們在伺服器端顯示的中文,但是響應給客戶端瀏覽器卻是亂碼。這主要是由於response對象中的方法返回到瀏覽器的字元串默認使用"ISO-8859-1"字符集進行Unicode字元串到位元組數組的轉換,由於ISO8859-1字符集中根本就沒有包含中文字元,所以Java在進行轉換的時候會將無效的字元編碼輸出給客戶端,於是便出現了亂碼,為此ServletResponse介面中便定義了setCharaterEncoding、setContentType等方法來指定getWriter方法返回的PrintWriter對象所使用的字符集編碼,所以我們在寫Servlet程式中,在調用getWriter方法之前設置這些方法的值。我們為了防止亂碼,經常將以下兩條語句一起寫上:

response.setContentType("text/html;charset=utf-8");

response.setCharacterEncoding("UTF-8");

只要編寫Servlet文件中含有響應給客戶端的資訊,那麼就要寫上這兩句話。最好寫上第二句話,因為它的優先順序高,它的設置結果將覆蓋setContentType等方法設置的字元編碼集。