linux servlet 亂碼問題,Servlet一次亂碼排查后的總結

由來

在寫一個小小的表單提交功能的時候,出現了亂碼,很奇怪request上來的參數全部是亂碼,而從數據庫查詢出來的中文顯示到頁面正常,鎖定肯定是request對象那里出了問題。后來經過排查,發現是我封裝的框架中出了問題,總結為在setCharacterEncoding方法之前,調用了getParameter方法,導致字符集改變失敗。沒看過Tomcat實現Servlet的源碼,貌似是一旦調用getParameter方法Request的參數就會全部被解析,從而再調用setCharacterEncoding就無效了。

原理解析

其實編碼問題本質還是兩點:

瀏覽器在封裝Http請求的時候的編碼和服務器在解析Http請求編碼不一致

服務器返回數據的時候編碼和瀏覽器解析不同。

那么我們就從這兩點入手解析。

瀏覽器請求

在點擊提交表單的那一刻,瀏覽器把表單內容封裝成一個Http請求,數據通過a=1&b=2這樣的形式直接請求服務器,表單值會被瀏覽器最一次urlencode,對于不同的請求方式編碼不同:

Get和Post請求

瀏覽器會讀取頁面的編碼(頁面編碼會在Content-type頭中體現),用此編碼對表單值做urlencode,那么到服務器的編碼方式就是你Content-Type里的編碼。很多通過JS提交表單為了規避瀏覽器的urlencode帶來的編碼混淆,會對數據首先做一次urlencode,這樣在服務器上做一次urldecode既可(因為js做完urlencode后內容為ASCII字符,所以這樣的字符無論瀏覽器用什么編碼解碼出來都是一樣的)

AJAX請求

在Jquery中AJAX請求全部使用utf8編碼封裝請求,如果你的頁面和項目用的非utf8編碼,一定會出現亂碼

瀏覽器地址欄直接輸入帶參數的地址

這種情況就比較復雜,不同的瀏覽器編碼也不相同。Chrome之類的瀏覽器默認使用utf8編碼(urlencode),而IE則使用GBK(死變態IE!!!)。

服務器端解碼

對于服務器端我在此只討論Servlet。

Get請求

對于Get請求,有兩種方式解碼:

在Servlet容器中設置,例如Tomcat設置URIEncoding="UTF-8",就會對Get請求用utf8解碼(貌似Tomcat7會報無效,具體解決請百度,反正我不同這種方法)

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"GBK"));第一個編碼就是你Servlet容器(例如Tomcat)里設置的編碼,默認iso-8859-1,第二個參數就是你瀏覽器使用的編碼格式。如果你用表單提交,那這個編碼就是頁面的編碼(Content-Type里的charset=XXX),如果你直接用瀏覽器地址欄里敲,恭喜你,你得判斷userAgent來使用不同編碼了。這也是我為啥不提倡第一種方式,因為它遇到瀏覽器直接敲出來的參數就非常不靈活。

至于為什么要使用getBytes("iso-8859-1"),是因為在你瀏覽器用某種編碼后,Servlet容器自作多情給你用iso-8859-1解碼了一下,如果你設置了URIEncoding="UTF-8"它就會用utf8給你解碼,運氣好你瀏覽器用的也是這種編碼,那解出來就直接用了,所以在ISO-8859-1的情況下你得再“原路返回”到二進制,重新用正確的編碼解碼一下。

Post請求和Ajax請求

Post請求就比較簡單一點了,同樣你可以使用Get請求中的方法2來解決,不過比較麻煩,這時候我們就可以使用Servlet里的方法request.setCharacterEncoding方法設置你的解碼類型,例如你的頁面編碼是utf8,表單則urlencode成utf8了,那么你在調用getParameter方法之前(記住,一定要之前!!在第一次調用getParameter之前!)使用setCharacterEncoding方法。 Ajax請求同理。

響應請求

響應也是相同道理,這回輪到服務器做編碼,瀏覽器做解碼。只需要設置response.setCharacterEncoding,就會自動在響應頭的Content-Type中加入charset=XXX,返回的內容就可以被正常解析啦~

我想我說的相對比較清楚了,網上很多解決亂碼的帖子都只是講你加上某句代碼就會解決,這樣是不科學的,一定也要知道原理,也要知道每句代碼背后做了哪些工作。其實我們在操作HttpServlet對象的時候,本質上是對Http頭的一些信息做修改。

如果有什么問題或者理解錯誤的地方,歡迎指正討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458930.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++回調函數

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 對于很多初學者來說,往往覺得回調函數很神秘,很想知道回調函數…

Linux 命令[2]:mkdir

make directories mkdir -p [目錄名] -p 遞歸創建 [rootlocalhost ~]# mkdir -p test [rootlocalhost ~]# ls anaconda-ks.cfg install.log install.log.syslog test 當然只創建一個目錄 -p 是可以省略的 注:如果創建多級目錄沒有 -p 會報錯 如: [roo…

jQuery動態設置樣式List item

前段時間&#xff0c;Insus.NET有修改一個功能《激活當前視圖菜單高亮呈現》http://www.cnblogs.com/insus/p/5287093.html 今天Insus.NET想改用另外一個方法來實現&#xff0c;使用jQuery。在ASP.NET MVC 環境實現&#xff1a; 代碼&#xff1a; <ul><li><a hr…

linux telnet 權限,允許telnet 通過root用戶進行訪問

允許telnet 通過root用戶進行訪問RHEL6:[rootclovem ~]# yum install telnet-server -y //安裝telnet服務端[rootclovem ~]# cat /etc/xinetd.d/telnet //開啟telnet的托管服務# default: on# description: The telnet server serves telnet sessions; it uses \#unencrypt…

TOUGHRADIUS 項目介紹

2019獨角獸企業重金招聘Python工程師標準>>> TOUGHRADIUS 項目介紹 ToughRADIUS是一個開源的Radius服務軟件&#xff0c;采用于 Apache License 2.0 許可協議發布&#xff0c;從創立之日起&#xff0c;他的宗旨就是服務于中小微ISP&#xff0c;讓運營變得更簡單。 T…

轉:Jmeter 用戶思考時間(User think time),定時器,和代理服務器(proxy server)...

在負載測試中需要考慮的的一個重要要素是思考時間&#xff08;think time&#xff09;&#xff0c; 也就是在兩次成功的訪問請求之間的暫停時間。 有多種情形揮發導致延遲的發生&#xff1a; 用戶需要時間閱讀文字內容&#xff0c;或者填表&#xff0c;或者查找正確的鏈接等。未…

linux sql語句傳參數,Linux/Unixshell參數傳遞到SQL腳本

在數據庫運維的過程中&#xff0c;Shell 腳本在很大程度上為運維提供了極大的便利性。而shell 腳本參數作為變量傳遞給SQL以及SQL腳本也是DB在數據庫運維的過程中&#xff0c;Shell 腳本在很大程度上為運維提供了極大的便利性。而shell 腳本參數作為變量傳遞給SQL以及SQL腳本也…

Myeclipse5.5獲取注冊碼

2019獨角獸企業重金招聘Python工程師標準>>> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MyEclipseGen {private static final String LL "Decompiling this copyrighted software is a vi…

虛函數和純虛函數的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 首先&#xff1a;強調一個概念 定義一個函數為虛函數&#xff0c;不代表函數為不被實…

工作日志WebRoot--編輯頁關于處理兩個關聯的選擇框

案例&#xff1a;點擊編輯&#xff0c;彈出界面后每個欄目都有一個默認的數值&#xff0c;但若其中一個選擇框發生更改&#xff0c;則觸發另一選擇框內的數據發生變動&#xff08;例如組織機構選擇發生變動&#xff0c;則相對應的組織機構的下屬機構也發生變動&#xff09;。 解…

linux下r語言畫圖,linux命令行下使用R語言繪圖實例講解

使用系統&#xff1a;centos 6.4 64bit在R語言中可以使用png()等函數生成圖片&#xff0c;例如&#xff1a; png("aa.png")可以生成圖片。但是如果你是通過shell遠程連接到系統上&#xff0c;可能會碰到如下錯誤&#xff1a;> png("aa.png")錯誤于.Exte…

Windows Mobile Gprs連接與數據傳輸

此模塊分兩部分完成&#xff0c;傳輸數據用socket &#xff0c;要使用socket在ppc上進行數據傳輸&#xff0c;就要誰讓ppc自動連接gprs 。其中套接字和gprs鏈接分別進行說明。 一 &#xff0c;應用程序在進行其它所需的Windows Sockets API調用需要進行一次成功的WSAStartup()調…

C語言變量的類型和存儲位置

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 1. C語言變量主要分為全局變量、靜態全局變量、局部變量、靜態局部變量和寄存器變量。…

nginx+tomcat負載均衡

最近練習nginxtomcat負載均衡。根據一些資料整理了大體思路&#xff0c;最終實現了1個nginx2個tomcat負載均衡。 安裝JDK 1》進入安裝目錄&#xff0c;給所有用戶添加可執行的權限 #chmod x jdk-7u67-linux-i586.rpm //不知這步有沒有必要 2》安裝JDK 輸入命令#rpm –ivh jdk-7…

linux 最強shell,最牛B 的 Linux Shell 命令(一)

引言Shell作為Unix系操作系統當中最有魅力且不可或缺的組件&#xff0c;經過數十載的洗禮不僅沒有被淘汰&#xff0c;而且愈加變得成熟穩健&#xff0c;究其原因&#xff0c;大概因為它是個非常穩固的粘合劑&#xff0c;能夠把大量功能強大的組件任意配搭&#xff0c;總能很好很…

更改Docker默認的images存儲位置

Docker的鏡像以及一些數據都是在/var/lib/docker目錄下&#xff0c;它占用的是Linux的系統分區&#xff0c;也就是下面的/dev/vda1,當有多個鏡像時&#xff0c;/dev/vda1的空間可能不足&#xff0c;我們可以把docker的數據掛載到數據盤&#xff0c;例如&#xff1a;/dev/vdb目錄…

malloc/free和new/delete的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** malloc與free是C/C語言的標準庫函數&#xff0c;new/delete是C的運算符。它們都可用于…

HDU 1217 Arbitrage (Floyd + SPFA判環)

題目鏈接&#xff1a;HDU 1217 Arbitrage 簡單的貨幣轉換問題&#xff0c;給定多種貨幣&#xff0c;以及貨幣之間的匯率&#xff0c;問能否通過貨幣的轉換實現收益。 例如&#xff1a; 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 F…

linux libbz2.so.1,libbz2.so.1.0 = not found 試過了鏈接和設置環境變量

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓LD_LIBRARY_PATH. ldd steamui.solinux-gate.so.1 > (0xf7700000)libtier0_s.so > ./libtier0_s.so (0xf648e000)libv8.so > ./libv8.so (0xf5ba3000)libvideo.so > ./libvideo.so (0xf57e2000)libvstdlib_s.so > .…

對互聯網中常見地圖的坐標系探討

文章版權由作者李曉暉和博客園共有&#xff0c;若轉載請于明顯處標明出處&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.背景 目前項目中使用百度地圖、高德地圖、谷歌中國地圖、天地圖的需求越來越多&#xff0c;這里我跟大家一起對各地圖使用的坐標系做一個簡單的探討。…