GET和POST差別詳解 收藏
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的預設方法。
以下的比較非常非常使用:
轉載自http://www.javaeye.com/topic/14980
做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. <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等)"/>
強烈建議使用post送出
////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
GET和POST兩種方法都是将資料送到伺服器,但你該用哪一種呢?
HTTP标準包含這兩種方法是為了達到不同的目的。POST用于建立資源,資源的内容會被編入HTTP請示的内容中。例如,處理訂貨表單、在資料庫中加入新資料行等。
當請求無副作用時(如進行搜尋),便可使用GET方法;當請求有副作用時(如在資料庫添加資料行),則用POST方法。一個比較實際的問題是:GET方法可能會産生很長的URL,或許會超過某些浏覽器與伺服器對URL長度的限制。
若符合下列任一情況,則用POST方法:
請求的結果有持續性的副作用,例如,資料庫内添加新的資料行。
若使用GET方法,則表單上收集的資料可能讓URL過長。
要傳送的資料不是采用7位的ASCII編碼。
若符合下列任一情況,則用GET方法:
請求是為了查找資源,HTML表單資料僅用來幫助搜尋。
請求結果無持續性的副作用。
收集的資料及HTML表單内的輸入字段名稱的總長不超過1024個字元。
表單送出中Get和Post方式的差別
1. get是從伺服器上擷取資料,post是向伺服器傳送資料。
2. get是把參數資料隊列加到送出表單的ACTION屬性所指的URL中,值和表單内各個字段一一對應,在URL中可以看到,是以安全性不高。post是通過HTTP post機制,将表單内各個字段與其内容放置在HTML HEADER内一起傳送到ACTION屬性所指的URL位址。使用者看不到這個過程,安全性比較高。
3. 對于get方式,伺服器端用Request.QueryString擷取變量的值,對于post方式,伺服器端用Request.Form擷取送出的資料。
4. get傳送的資料量較小,不能大于2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
5. get安全性非常低,post安全性較高。
6. post 頁面不能被加入收藏夾中,get頁面可以被加入。
ContentType和Form中enctype屬性的相對應,它是Form用來組織資料的方式,主要包含了兩種:
1、application/x-www-form-urlencoded:它是預設内容類型(content type),在結果中我們已經看到了經它編碼的資料的效果。編碼方法:i.将空格使用“+”代替,非字母和數字字元,是用以%HH表示的該字元的ASCII代替(漢字就是這種形式);ii.變量和值使用“=”,各個變量和值對之間使用“&”連接配接。
2、multipart/form-data:它可以用來傳輸大量二進制資料或者非ASCII字元的文本,是以在上傳檔案需設定enctype="multipart/form-data",此時method必須為post。它傳輸的消息包含了一系列的資料塊,每一塊都代表Form中的一個變量,并且資料塊的順序和頁面上的順序一緻,塊與塊之間使用特殊字元(boundary)分隔。如果Form中包含file控件,相應的資料塊還會包含一個Content-Type頭,用來指定MIME,預設值為text/plain。下面是設定enctype="multipart/form-data"時content的結果: