首頁 > web前端 > html教學 > GET POST 區別詳解_HTML/Xhtml_網頁製作

GET POST 區別詳解_HTML/Xhtml_網頁製作

WBOY
發布: 2016-05-16 16:43:07
原創
1233 人瀏覽過

1、Get是用來從伺服器取得數據,而Post是用來傳遞資料到伺服器。
2、Get將表單中資料的依照variable=value的形式,加入action所指向的URL後面,並且兩者使用「?」連接,而各個變數之間使用「&」連接;Post是將表單中的資料放在form的資料體中,依照變數和值相對應的方式,傳遞到action所指向URL。
3、Get是不安全的,因為在傳輸過程,資料被放在請求的URL中,而如今現有的許多伺服器、代理伺服器或使用者代理都會將請求URL記錄到日誌檔案中,然後放在某個地方,這樣就可能會有一些隱私的資訊被第三方看到。另外,使用者也可以在瀏覽器上直接看到提交的數據,有些系統內部訊息將會一同顯示在使用者面前。 Post的所有操作對使用者來說都是不可見的。
4、Get傳輸的數據量小,這主要是因為受URL長度限制;而Post可以傳輸大量的數據,所以在上傳文件只能使用Post(當然還有一個原因,將在後面的提到)。
5、Get限制Form表單的資料集的值必須為ASCII字元;而Post支援整個ISO10646字元集。預設是用ISO-8859-1編碼
6、Get是Form的預設方法。
以下的比較非常非常使用:
做java的web開發有段日子了,有個問題老是困擾著我,就是亂碼問題,基本上是網路找解決方案(網路資料真的很多),都是一大堆的介紹如何解決此類的亂碼問題,但是沒幾個把問題的來龍去脈說清楚的,有時候看了些文章後,以為自己懂了,但是在開發中亂碼問題又像鬼魂一樣出來嚇人,真是頭大了!這篇文章是我長時間和亂碼做鬥爭的一些理解的積累,也希望有更多的朋友給出指點和補充。
  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.  
這樣是讓tomcat在取得資料後用指定的方式URL decoder,URL decoder的介紹在這裡
(一)post提交
1.客戶端(瀏覽器)的form表單用post方法是如何將資料編碼後提交給伺服器端的。
  在post方法裡所要傳送的資料也要URL encode,那他是用什麼編碼方式的呢?
   在form所在的html檔案裡如果有段,那麼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檔案裡如果有段
強烈建議使用post提交

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板