form有2中方法把資料提交給伺服器,get 和post ,分別說下吧。
(一)get 提交
1.首先說下客戶端(瀏覽器)的form表單用get 方法是如何將資料編碼後提交給伺服器端的吧。
對於get 方法來說,都是把資料串聯在請求的url後面作為引數,如:http://localhost:8080/servlet?msg=abc
(很常見的一個亂碼問題就要出現了,如果url中出現中文或其它特殊字元的話,如:http://localhost:8080 /servlet?msg=杭州,伺服器端容易得到亂碼),url拼接完成後,瀏覽器會對url進行URL encode,然後傳送給伺服器,URL encode的過程就是把部分url做為字元,按照某種編碼方式(如:utf-8,gbk等)編碼成二進位制的位元組碼,然後每個位元組用一個包含3個字元的字串 "%xy" 表示,其中xy為該位元組的兩位十六進位制表示形式。我這裡說的可能不清楚,具體介紹可以看下java.net.URLEncoder類的介紹在這裡。瞭解了 URL encode的過程,我們能看到2個很重要的問題,第一:需要URL encode的字元一般都是非ASCII的字元(籠統的講),再通俗的講就是除了英文字母以外的文字(如:中文,日文等)都要進行URL encode,所以對於我們來說,都是英文字母的url不會出現伺服器得到亂碼問題,出現亂碼都是url裡面帶了中文或特殊字元造成的;第二:URL encode到底按照那種編碼方式對字元編碼?這裡就是瀏覽器的事情了,而且不同的瀏覽器有不同的做法,中文版的瀏覽器一般會預設的使用GBK,通過設定瀏覽器也可以使用UTF-8,可能不同的使用者就有不同的瀏覽器設定,也就造成不同的編碼方式,所以很多網站的做法都是先把url裡面的中文或特殊字元用 javascript做URL encode,然後再拼接url提交資料,也就是替瀏覽器做了URL encode,好處就是網站可以統一get方法提交資料的編碼方式。 完成了URL encode,那麼現在的url就成了ASCII範圍內的字元了,然後以iso-8859-1的編碼方式轉換成二進位制隨著請求頭一起傳送出去。這裡想多說幾句的是,對於get 方法來說,沒有請求實體,含有資料的url都在請求頭裡面,之所以用URL encode,我個人覺的原因是:對於請求頭來說最終都是要用iso-8859-1編碼方式編碼成二進位制的101010.....的純資料在網際網路上傳送,如果直接將含有中文等特殊字元做iso-8859-1編碼會丟失資訊,所以先做URL encode是有必要的。
2。伺服器端(tomcat)是如何將資料獲取到進行解碼的。
第一步是先把資料用iso-8859-1進行解碼,對於get 方法來說,tomcat獲取資料的是ASCII範圍內的請求頭字元,其中的請求url裡面帶有引數資料,如果引數中有中文等特殊字元,那麼目前還是URL encode後的%XY狀態,先停下,我們先說下開發人員一般獲取資料的過程。通常大家都是request.getParameter("name")獲取引數資料,我們在request物件或得的資料都是經過解碼過的,而解碼過程中程式裡是無法指定,這裡要說下,有很多新手說用 request.setCharacterEncoding("字符集")可以指定解碼方式,其實是不可以的 ,看servlet的官方API說明有對此方法的解釋:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出對於get 方法他是無能為力的。那麼到底用什麼編碼方式解碼資料的呢,這是tomcat的事情了,預設預設用的是 iso-8859-1,這樣我們就能找到為什麼get 請求帶中文引數為什麼在伺服器端得到亂碼了,原因是在客戶端一般都是用UTF-8或GBK對資料 URL encode,這裡用iso-8859-1方式URL decoder顯然不行,在程式裡我們可以直接
Java程式碼
1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客戶端指定的URL encode編碼方式")
還原回位元組碼,然後用正確的方式解碼資料,網上的文章通常是在tomcat裡面做個配置
Xml程式碼
1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>
這樣是讓tomcat在獲取資料後用指定的方式URL decoder,URL decoder的介紹在這裡
(一)post 提交
1.客戶端(瀏覽器)的form表單用post 方法是如何將資料編碼後提交給伺服器端的。
在post 方法裡所要傳送的資料也要URL encode,那麼他是用什麼編碼方式的呢?
在form所在的html檔案裡如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那麼post 就會用此處指定的編碼方式編碼。 一般大家都認為這段程式碼是為了讓瀏覽器知道用什麼字符集來對網頁解釋,所以網站都會把它放在html程式碼的最前端,儘量不出現亂碼,其實它還有個作用就是指定form表單的post 方法提交資料的 URL encode編碼方式 。從這裡可以看出對於get 方法來數,瀏覽器對資料的URL encode的編碼方式是有瀏覽器設定來決定,(可以用js做統一指定),而post 方法,開發人員可以指定。
2。伺服器端(tomcat)是如何將資料獲取到進行解碼的。
如果用tomcat預設預設設定,也沒做過濾器等編碼設定,那麼他也是用iso-8859-1解碼的,但是request.setCharacterEncoding("字符集")可以派上用場。
我發現上面說的tomcat所做的事情前提都是在請求頭裡沒有指定編碼方式,如果請求頭裡指定了編碼方式將按照這種方式編碼。
有2篇文章推薦下,地址分別是
深入淺出URL編碼:http://www.cnblogs.com/yencain/articles/1321386.html ;
表單用post 方法提交資料時亂碼問題:http://wanghuan8086.javaeye.com/blog/173869
用post 很重要的在form所在的html檔案裡如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>
引數傳遞中編碼問題(Get/Post 方式)(二)
相關文章
- 解決ajax get post方式提交中文引數亂碼問題
- 二維陣列作為引數傳遞問題陣列
- RestTemplate exchange GET POST請求傳引數DEMOREST
- 引數傳遞方式必須是const引用傳遞
- C++引數的傳遞方式C++
- vue 新增axios解決post傳引數為null問題VueiOSNull
- java 傳遞引數的兩種方式Java
- 使用python指令碼傳遞引數:(三種方式可收藏)Python指令碼
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- drf serializer 字首 get 是什麼? 如何傳遞引數?
- post傳引數,但是後端無法接收問題解決後端
- Java中將方法作為引數傳遞5種方式Java
- nGrinder中快速編寫groovy指令碼03-在GET請求中傳送引數指令碼
- linux中main引數傳遞LinuxAI
- Vue + Spring Boot——axios使用GET以引數的方式傳遞物件到SpringMVC解決方案VueSpring BootiOS物件SpringMVC
- 引數傳遞
- get方式傳參的以post方法傳的解決方法
- vb.net 介面POST方式傳引數提交返回值
- postman(二):使用postman傳送get or post請求Postman
- PHP中GET與POST變數PHP變數
- c++ -- 二維陣列引數傳遞C++陣列
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- Mybatis引數傳遞MyBatis
- python中函式的引數傳遞Python函式
- 寶塔 Nginx免費防火牆 post 引數太多POST傳遞的引數數量超過800,拒絕訪問,如有誤報請點選誤報Nginx防火牆
- 關於Jmeter引數化的編碼問題JMeter
- Shell自學二(引數傳遞和陣列)陣列
- 將函式作為引數傳遞解決非同步問題函式非同步
- String和StringBuffer型別資料進行引數傳遞問題型別
- js中 函式引數的 傳值/傳引用 問題JS函式
- go 呼叫 shell 指令碼 如何傳遞引數Go指令碼
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- Js傳遞陣列引數到後臺controller的方式JS陣列Controller
- JS的方法引數傳遞(按值傳遞)JS
- 二級指標,二維陣列函式引數傳遞指標陣列函式
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- 通過行為引數化傳遞程式碼
- shell (3)指令碼引數傳遞與數學運算指令碼