【原創】Tomcat在處理GET和POST請求時產生的亂碼問題
本文為原創,如需轉載,請註明作者和出處,謝謝
有個朋友寫JSP程式時,在Servlet中取請求引數時出現了亂碼,當然,這種亂碼問題再簡單不過了。由於在JSP中使用了GBK作用頁面的編碼,那麼提交的中文資訊自然也會被按著GBK進行編碼,為%xx格式的GBK編碼。
要解決這個問題可以說是方法多多。最簡單的就是使用request.setCharacterEncoding方法設定編碼格式,如下面的程式碼所示:
request.setCharacterEncoding("GBK");
在設定完編碼格式之後,就可以直接通過request.getParameter方法來獲得請求引數中的中文資訊了。當然,為了方便,還可以在過濾器中加入上面的語句,這樣所有的Servlet都可以直接使用 request.getParameter方法來獲得請求引數中的中文資訊了。 除了這兩種方法,還可以不使用request.setCharacterEncoding("GBK"),而使用下面的語言來轉換編碼:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
但為了更快解決這個問題,我就直接告訴這位朋友使用了setCharacterEncoding方法來設定編碼。但是說來奇怪,還是出現亂碼,沒有任何解決問題的跡象。 最鬱悶的事就是使用了自己認為100%能解決問題的方法,而這種方法卻一點都沒起作用。
最後又讓朋友試了最後一種方法,說來奇怪,竟然好使了。當然,這也沒什麼可奇怪的,本來就應該好使,但奇就奇在setCharacterEncoding方法並沒有去掉,也就是說,同時使用了下面兩條語句,竟然得到了正常的中文請求引數值:
按著常理來說,這是不可能的,既然使用了setCharacterEncoding方法設定成了GBK,再使用new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")來轉換,得到的應該是?????,不可能是正常的中文,只有將setCharacterEncoding方法去了,以ISO-8859-1格 式儲存的字串才可以用ISO-8859-1格式還原,再用GBK重新儲存成Java字串(這一步實際上就是GBK轉Unicode)。
但經過仔細思考後,決定看下JSP程式碼是如何寫的。不看不知道,一看嚇一跳,原來request.setCharacterEncoding方法設定的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的位元組轉換成字串。
解決的方法有兩個:
1. 將GET請求改成POST請求,然後就可以使用request.setCharacterEncoding方法設定編碼,並使用request.getParameter方法直接獲得中文請求引數了。
2. 不用改GET請求,在Servlet中使用如下的程式碼來得到中文請求引數。
綜上所述,如果使用了GET請求,則setCharacterEncoding方法不起作用,只能使用上面的程式碼來解決,而使用POST請求,儘管setCharacterEncoding 方法起作用,但使用上面的程式碼仍然好使(在這時不能使用setCharacterEncoding方法將編碼格式設定成非iso-8859-1格式)。因 此,如果想讓Servlet可以同時處理GET和POST請求中的中文資訊,除了判斷這兩種方法外,還可以使用上面的程式碼來同時處理這兩種請求的中文信 息。
筆者建議使用如下的程式碼來獲得中文請求引數:
因為上面的程式碼是利用了Java的編碼能力,對於所有的Web伺服器都會有效,而setCharacterEncoding方法是通過Web伺服器支援的,並不是所有的Web伺服器都會對該方法有很好的支援。
有個朋友寫JSP程式時,在Servlet中取請求引數時出現了亂碼,當然,這種亂碼問題再簡單不過了。由於在JSP中使用了GBK作用頁面的編碼,那麼提交的中文資訊自然也會被按著GBK進行編碼,為%xx格式的GBK編碼。
要解決這個問題可以說是方法多多。最簡單的就是使用request.setCharacterEncoding方法設定編碼格式,如下面的程式碼所示:
request.setCharacterEncoding("GBK");
在設定完編碼格式之後,就可以直接通過request.getParameter方法來獲得請求引數中的中文資訊了。當然,為了方便,還可以在過濾器中加入上面的語句,這樣所有的Servlet都可以直接使用 request.getParameter方法來獲得請求引數中的中文資訊了。 除了這兩種方法,還可以不使用request.setCharacterEncoding("GBK"),而使用下面的語言來轉換編碼:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
但為了更快解決這個問題,我就直接告訴這位朋友使用了setCharacterEncoding方法來設定編碼。但是說來奇怪,還是出現亂碼,沒有任何解決問題的跡象。 最鬱悶的事就是使用了自己認為100%能解決問題的方法,而這種方法卻一點都沒起作用。
最後又讓朋友試了最後一種方法,說來奇怪,竟然好使了。當然,這也沒什麼可奇怪的,本來就應該好使,但奇就奇在setCharacterEncoding方法並沒有去掉,也就是說,同時使用了下面兩條語句,竟然得到了正常的中文請求引數值:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->request.setCharacterEncoding("GBK");
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
System.out.println(name); // 正常輸出中文請求引數
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->request.setCharacterEncoding("GBK");
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
System.out.println(name); // 正常輸出中文請求引數
按著常理來說,這是不可能的,既然使用了setCharacterEncoding方法設定成了GBK,再使用new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")來轉換,得到的應該是?????,不可能是正常的中文,只有將setCharacterEncoding方法去了,以ISO-8859-1格 式儲存的字串才可以用ISO-8859-1格式還原,再用GBK重新儲存成Java字串(這一步實際上就是GBK轉Unicode)。
但經過仔細思考後,決定看下JSP程式碼是如何寫的。不看不知道,一看嚇一跳,原來request.setCharacterEncoding方法設定的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的位元組轉換成字串。
解決的方法有兩個:
1. 將GET請求改成POST請求,然後就可以使用request.setCharacterEncoding方法設定編碼,並使用request.getParameter方法直接獲得中文請求引數了。
2. 不用改GET請求,在Servlet中使用如下的程式碼來得到中文請求引數。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
綜上所述,如果使用了GET請求,則setCharacterEncoding方法不起作用,只能使用上面的程式碼來解決,而使用POST請求,儘管setCharacterEncoding 方法起作用,但使用上面的程式碼仍然好使(在這時不能使用setCharacterEncoding方法將編碼格式設定成非iso-8859-1格式)。因 此,如果想讓Servlet可以同時處理GET和POST請求中的中文資訊,除了判斷這兩種方法外,還可以使用上面的程式碼來同時處理這兩種請求的中文信 息。
筆者建議使用如下的程式碼來獲得中文請求引數:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
因為上面的程式碼是利用了Java的編碼能力,對於所有的Web伺服器都會有效,而setCharacterEncoding方法是通過Web伺服器支援的,並不是所有的Web伺服器都會對該方法有很好的支援。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-442044/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- request的get和post引數亂碼問題
- Spring Tomcat Post Get 請求引數有中文時出現亂碼或+號變空格等關於編碼的問題SpringTomcat
- Servlet中request請求Get和Post方法以及亂碼解決Servlet
- 關於在request請求時,處理請求引數的問題
- TOMCAT 請求資料編碼亂碼 問題Tomcat
- jboss get請求中文亂碼問題的解決[zt]
- Spring MVC的Post請求引數中文亂碼的原因&處理SpringMVC
- Get和Post請求詳解
- Chrome在302重定向的時候對原請求產生2次請求的問題說明Chrome
- Postman 使用 Get 請求 URL 傳參中文亂碼的問題Postman
- ajax 請求的時候 get 和 post 方式的區別?
- get和post請求的區別(面試)面試
- java傳送GET和post請求Java
- PHP傳送POST和GET請求PHP
- GET請求引數為中文時亂碼分析
- Android Http請求框架一:Get 和 Post 請求AndroidHTTP框架
- AJAX的POST和GET請求的區別
- http請求之get和post的區別HTTP
- JAVA中Get和Post請求的區別Java
- vue-resource get/post請求如何攜帶cookie的問題VueCookie
- get請求和post請求的區別
- beego Session main 在 ctx.Request.RequestURI放行一個get post 請求問題GoSessionAI
- 小議Servlet接收post和get混合提交中文亂碼問題薦Servlet
- iOS 同步請求 非同步請求 GET請求 POST請求iOS非同步
- Tomcat 7 的一次請求分析(一)處理執行緒的產生Tomcat執行緒
- http請求中get和post方法的區別HTTP
- HTTP協議GET和POST請求的區別HTTP協議
- AJAX的get和post請求原生編寫方法
- HTTP協議中請求方法的Get和PostHTTP協議
- get與post的請求區別
- nodejs關於get和post請求程式碼例項NodeJS
- $.post 和 $.get 設定同步和非同步請求非同步
- uni-app的POST請求和GET請求APP
- 優雅地使用GET和POST請求方法
- 使用fidder進行post和get請求
- POST與GET請求區別
- HTTP Get,Post請求詳解HTTP
- Tomcat 5環境下的jsp中文亂碼問題(分別針對POST、GET方法)TomcatJS