1. 程式人生 > >form中get和post的區別

form中get和post的區別

一、get和post定義
form元素的method屬性用來指定傳送form的http方法:
使用get時,form資料集被附加到form元素的action屬性所指定的URI後面。
使用post時,form資料集被包裝在請求的body中並被髮送。
Java程式碼  收藏程式碼
  1. <form method="get" action="user.do">  
  2.     <input type="text" name="loginId" value="abc">  
  3.     <input type="submit" value="get提交">  
  4. </form>  

使用get提交方式,生成的URI:user.do?loginId=abc
get僅僅是拼接一個URI,然後直接向服務區請求資料,需要提交給伺服器的資料集包含在URI中。
使用post提交方式,生成的URI:user.do
post會把form的資料集,即loginId=abc這個鍵值對包裝在請求的body中,發給伺服器,然後向伺服器請求資料。

二、get和post區別
1、安全性
如果用get提交一個驗證使用者名稱和密碼的form,一般認為是不安全的,因為使用者名稱和密碼將出現在URL上,進而出現在瀏覽器的歷史記錄中。顯然,在對安全性有要求的情況下,應該使用post。
2、編碼
get只能向伺服器傳送ASCII字元,而post則可以傳送整個ISO10646中的字元。
get和post對應的enctype屬性有區別。enctype有兩個值預設值為application/x-www-form-urlencoded,而另一個值multipart/form-data只能用於post。
3、提交的資料長度
IE將請求的URL長度限制為2083個字元,從而限制了get提交的資料長度,如果URL超出了這個限制,提交form時IE不會有任何反映。
4、快取
由於一個get得到的結果直接對應到一個URI,所以get的結果頁面有可能被瀏覽器快取。而post一般則不能。
5、引用和SEO
可以用一個URI引用一個get的結果頁面,而post的結果則不能,所以必然不能被搜尋引擎搜到。

三、正確的使用get和post
當且僅當form是冪等的時候,使用get。
冪等:多次相同的請求產生的副作用,和一次請求的副作用相同。

如果提交請求純粹只是從伺服器端獲取資料而不是進行其他操作,並且多次提交不會有明顯的副作用,應該使用get。
比如:搜尋引擎的查詢(http://www.google.com/search?q=abc)和分頁(user.do?page=1)
如果提交這個請求會產生其他操作和影響,就應該使用post。
比如:修改伺服器上資料庫中的資料;傳送一封郵件;刪除一個檔案等

另一個要考慮因素是安全性。

若符合下列任一情況,則用post方法:
a.請求的結果有持續性的副作用,例如:資料庫內新增新的資料行。
b.若使用get方法,則表單上收集的資料可能讓URL過長。
c.要傳送的資料不是採用ASCII編碼。
若符合下列任一情況,則用get方法:
a.請求是為了查詢資源,html表單資料僅用來搜尋。
b.請求結果無持續性的副作用。
c.收集的資料及html表單內的輸入欄位名稱的總長不超過1024個字元。

四、瀏覽器差異
IE6:URL長度限制為2083個字元;post之後,重新整理頁面不會自動重新post資料,會出現警告。
IE7和IE6相同。
Firefox:重新整理頁面不會自動重新post資料會出現警告。