post和get的區(qū)別
post 地址欄不會(huì)出現(xiàn)一大串?bjnghfgreygt這樣的東西
如果是get,就會(huì)出現(xiàn)了
1、Get 方法通過(guò) URL 請(qǐng)求來(lái)傳遞用戶的數(shù)據(jù),將表單內(nèi)各字段名稱(chēng)與其內(nèi)容,以成對(duì)的字符串連接,置于 action 屬性所指程序的 url 后,如[url]http://www.mdm.com/test.asp?name=asd&password=sad[/url],數(shù)據(jù)都會(huì) 直接顯示在 url 上,就像用戶點(diǎn)擊一個(gè)鏈接一樣;Post 方法通過(guò) HTTP post 機(jī)制,將表單內(nèi)各字段名稱(chēng)與其內(nèi)容放置在 HTML 表頭(header)內(nèi)一起傳送給服務(wù)器端交由 action 屬性能所指的程序處理,該程序會(huì)通過(guò)標(biāo)準(zhǔn)輸入(stdin)方式,將表單的數(shù)據(jù)讀出并加以處理
2、 Get 方式需要使用 Request.QueryString 來(lái)取得變量的值;而 Post 方式通過(guò) Request.Form 來(lái)訪問(wèn)提交的內(nèi)容
3、Get 方式傳輸?shù)臄?shù)據(jù)量非常小,一般限制在 2 KB 左右,但是執(zhí)行效率卻比 Post 方法好;而 Post 方式傳遞的數(shù)據(jù)量相對(duì)較大,它是等待服務(wù)器來(lái)讀取數(shù)據(jù),不過(guò)也有字節(jié)限制,這是為了避免對(duì)服務(wù)器用大量數(shù)據(jù)進(jìn)行惡意攻擊,根據(jù)微軟方面的說(shuō)法,微軟對(duì)用 Request.Form() 可接收的最大數(shù)據(jù)有限制,IIS 4 中為 80 KB 字節(jié),IIS 5 中為 100 KB 字節(jié)
建議:除非你肯定你提交的數(shù)據(jù)可以一次性提交,否則請(qǐng)盡量用 Post 方法
4、Get 方式提交數(shù)據(jù),會(huì)帶來(lái)安全問(wèn)題,比如一個(gè)登陸頁(yè)面,通過(guò) Get 方式提交數(shù)據(jù)時(shí),用戶名和密碼將出現(xiàn)在 URL 上,如果頁(yè)面可以被緩存或者其他人可以訪問(wèn)客戶這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶的帳號(hào)和密碼,所以表單提交建議使用 Post 方法;Post 方法提交的表單頁(yè)面常見(jiàn)的問(wèn)題是,該頁(yè)面如果刷新的時(shí)候,會(huì)彈出一個(gè)對(duì)話框
建議:出于安全性考慮,建議最好使用 Post 提交數(shù)據(jù) |
post和get的不同之處
GET與POST的區(qū)別在于:(對(duì)于CGI)
如果以GET方式傳輸,所帶參數(shù)附加在CGI程式的URL后直接傳給server,并可從server端的QUERY_STRING這個(gè)環(huán)境變量中讀?。?/span>
如果以POST方式傳輸,則參數(shù)會(huì)被打包在數(shù)據(jù)報(bào)中傳送給server,并可從CONTENT_LENGTH這個(gè)環(huán)境變量中讀取出來(lái)。
還有一種情況是,你用的是GET方式,但傳送的參數(shù)是路徑,如:
----< ahref="/cgi-bin/a.pl/usr/local/bin/pine" >CGI< /a >
----這時(shí)所傳遞的參數(shù)"/usr/local/bin/pine"存放在PATH_INFO這個(gè)環(huán)境變量中。環(huán)境變量的讀取方式為$str=$ENV{'QUERY_STRING'};
理論上說(shuō),GET是從服務(wù)器上請(qǐng)求數(shù)據(jù),POST是發(fā)送數(shù)據(jù)到服務(wù)器。事實(shí)上,GET方法是把數(shù)據(jù)參數(shù)隊(duì)列(query string)加到一個(gè)URL上,值和表單是一一對(duì)應(yīng)的。比如說(shuō),name=John。在隊(duì)列里,值和表單用一個(gè)&符號(hào)分開(kāi),空格用 號(hào)替換,特殊的符號(hào)轉(zhuǎn)換成十六進(jìn)制的代碼。因?yàn)檫@一隊(duì)列在URL里邊,這樣隊(duì)列的參數(shù)就能看得到,可以被記錄下來(lái),或更改。通常GET方法還限制字符的大小。事實(shí)上POST方法可以沒(méi)有時(shí)間限制的傳遞數(shù)據(jù)到服務(wù)器,用戶在瀏覽器端是看不到這一過(guò)程的,所以POST方法比較適合用于發(fā)送一個(gè)保密的(比如信用卡號(hào))或者比較大量的數(shù)據(jù)到服務(wù)器。
Post是允許傳輸大量數(shù)據(jù)的方法,而Get方法會(huì)將所要傳輸?shù)臄?shù)據(jù)附在網(wǎng)址后面,然后一起送達(dá)服務(wù)器,因此傳送的數(shù)據(jù)量就會(huì)受到限制,但是執(zhí)行效率卻比Post方法好。
對(duì)于GET提交的數(shù)據(jù),WWW服務(wù)器將把數(shù)據(jù)放在環(huán)境變量QUERY_STRING中;對(duì)于POST方法,數(shù)據(jù)被送到WWW服務(wù)器的STDOUT中,然后CGI從自己的STDIN中讀取。使用傳統(tǒng)的CGI方法,用戶必須自己編程來(lái)處理這些數(shù)據(jù)。
GET與POST的區(qū)別在于,如果以GET方式傳輸,所帶參數(shù)附加在CGI程式的URL后直接傳給server,并可從server端的QUERY_STRING這個(gè)環(huán)境變量中讀取;如果以POST方式傳輸,則參數(shù)會(huì)被打包在數(shù)據(jù)報(bào)中傳送給server,并可從CONTENT_LENGTH這個(gè)環(huán)境變量中讀取出來(lái)。還有一種情況是,你用的是GET方式,但傳送的參數(shù)是路徑,如:
----< ahref="/cgi-bin/a.pl/usr/local/bin/pine" >CGI< /a >
----這時(shí)所傳遞的參數(shù)"/usr/local/bin/pine"存放在PATH_INFO這個(gè)環(huán)境變量中。環(huán)境變量的讀取方式為$str=$ENV{'QUERY_STRING'};
總結(jié)起來(lái):
get方式:以URL字串本身傳遞數(shù)據(jù)參數(shù),在服務(wù)器端可以從'QUERY_STRING'這個(gè)變量中直接讀取,效率較高,但缺乏安全性,也無(wú)法來(lái)處理復(fù)雜的數(shù)據(jù)(只能是字符串,比如在servlet/jsp中就無(wú)法處理發(fā)揮java的比如vector之類(lèi)的功能);
post方式:就傳輸方式講參數(shù)會(huì)被打包在數(shù)據(jù)報(bào)中傳輸,從CONTENT_LENGTH這個(gè)環(huán)境變量中讀取,便于傳送較大一些的數(shù)據(jù),同時(shí)因?yàn)椴槐┞稊?shù)據(jù)在瀏覽器的地址欄中,安全性相對(duì)較高,但這樣的處理效率會(huì)受到影響。
-------------------
GET 和 POST 請(qǐng)求的區(qū)別
// --TCP/IP 協(xié)議詳解卷3
13.3.1 報(bào)文類(lèi)型:請(qǐng)求與響應(yīng)
HTTP / 1 . 0報(bào)文有兩種類(lèi)型:請(qǐng)求和響應(yīng)。HTTP / 1 . 0請(qǐng)求的格式是:
reqe t - l i n e
headers ( 0或有多個(gè))
body (只對(duì)POST請(qǐng)求有效) request - l i n e的格式是:
request request-URI HTTP版本號(hào)
支持以下三種請(qǐng)求:
1) G E T請(qǐng)求,返回re q u e s t - U R I所指出的任意信息。
2) H E A D請(qǐng)求,類(lèi)似于G E T請(qǐng)求,但服務(wù)器程序只返回指定文檔的首部信息,而不包含實(shí)際的文檔內(nèi)容。該請(qǐng)求通常被用來(lái)測(cè)試超文本鏈接的正確性、可訪問(wèn)性和最近的修改。
3) P O S T請(qǐng)求用來(lái)發(fā)送電子郵件、新聞或發(fā)送能由交互用戶填寫(xiě)的表格。這是唯一需要在請(qǐng)求中發(fā)送b o d y的請(qǐng)求。使用P O S T請(qǐng)求時(shí)需要在報(bào)文首部C o n t e n t - L e n g t h字段中
指出b o d y的長(zhǎng)度。
// --TCP/IP 協(xié)議詳解卷3
明白?get 請(qǐng)求表示客戶端請(qǐng)求一個(gè)uri,服務(wù)器返回客戶端請(qǐng)求的uri,post請(qǐng)求表示客戶端請(qǐng)求的時(shí)候還要提交數(shù)據(jù),比喻提交form表單,要提交的數(shù)據(jù)會(huì)放到請(qǐng)求報(bào)文的body部分。服務(wù)器收到后這樣的請(qǐng)求后通常需要來(lái)處理這些數(shù)據(jù)。
應(yīng)聘j2ee開(kāi)發(fā)時(shí)問(wèn)這個(gè)問(wèn)題說(shuō)明提問(wèn)著的重點(diǎn)是服務(wù)器對(duì)這兩種請(qǐng)求的處理有什么不同,而不是這兩種請(qǐng)求的報(bào)文有什么不同。當(dāng)然作為一個(gè)jsp servlet的開(kāi)發(fā)者一般你是不會(huì)感覺(jué)到著兩種請(qǐng)求有什么不同的,因?yàn)閣eb服務(wù)器已經(jīng)對(duì)這些請(qǐng)求進(jìn)行處理了,web服務(wù)器調(diào)用相應(yīng)的 jsp/servlet來(lái)響應(yīng)客戶端請(qǐng)求的時(shí)候,對(duì)于post的請(qǐng)求,web服務(wù)器已經(jīng)把客戶端提交的數(shù)據(jù)取出來(lái),添到request對(duì)象中去了。不過(guò),對(duì)于get、post的請(qǐng)求servlet 的 doGet、 doPost方法會(huì)被響應(yīng)調(diào)用。也就是說(shuō)如果客戶端送來(lái)的是一個(gè)get的請(qǐng)求,那么你寫(xiě)到servlet中的dopost()方法中的代碼是不會(huì)執(zhí)行的,反之如果是post的請(qǐng)求,寫(xiě)在doget()中代碼是不會(huì)被調(diào)用的(對(duì)于所有方式的請(qǐng)求,寫(xiě)在doservice的代碼是會(huì)被調(diào)用的,因?yàn)樵贖ttpServlet類(lèi)中doGet doPost的請(qǐng)求都是由doService來(lái)分發(fā)的,具體的看關(guān)于servlet的生命周期介紹)。
HTTP請(qǐng)求:GET與POST方法的區(qū)別
HTTP 定義了與服務(wù)器交互的不同方法,最基本的方法是 GET 和 POST。事實(shí)上 GET 適用于多數(shù)請(qǐng)求,而保留 POST 僅用于更新站點(diǎn)。根據(jù) HTTP 規(guī)范,GET 用于信息獲取,而且應(yīng)該是 安全的和 冪等的。所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說(shuō),GET 請(qǐng)求一般不應(yīng)產(chǎn)生副作用。冪等的意味著對(duì)同一 URL 的多個(gè)請(qǐng)求應(yīng)該返回同樣的結(jié)果。完整的定義并不像看起來(lái)那樣嚴(yán)格。從根本上講,其目標(biāo)是當(dāng)用戶打開(kāi)一個(gè)鏈接時(shí),她可以確信從自身的角度來(lái)看沒(méi)有改變資源。比如,新聞?wù)军c(diǎn)的頭版不斷更新。雖然第二次請(qǐng)求會(huì)返回不同的一批新聞,該操作仍然被認(rèn)為是安全的和冪等的,因?yàn)樗偸欠祷禺?dāng)前的新聞。反之亦然。POST 請(qǐng)求就不那么輕松了。POST 表示可能改變服務(wù)器上的資源的請(qǐng)求。仍然以新聞?wù)军c(diǎn)為例,讀者對(duì)文章的注解應(yīng)該通過(guò) POST 請(qǐng)求實(shí)現(xiàn),因?yàn)樵谧⒔馓峤恢笳军c(diǎn)已經(jīng)不同了(比方說(shuō)文章下面出現(xiàn)一條注解);
在FORM提交的時(shí)候,如果不指定Method,則默認(rèn)為GET請(qǐng)求,F(xiàn)orm中提交的數(shù)據(jù)將會(huì)附加在url之后,以?分開(kāi)與url分開(kāi)。字母數(shù)字字符原樣發(fā)送,但空格轉(zhuǎn)換為“ “號(hào),其它符號(hào)轉(zhuǎn)換為%XX,其中XX為該符號(hào)以16進(jìn)制表示的ASCII(或ISO Latin-1)值。GET請(qǐng)求請(qǐng)?zhí)峤坏臄?shù)據(jù)放置在HTTP請(qǐng)求協(xié)議頭中,而POST提交的數(shù)據(jù)則放在實(shí)體數(shù)據(jù)中;
GET方式提交的數(shù)據(jù)最多只能有1024字節(jié),而POST則沒(méi)有此限制。
get和post方法的不同 在B/S應(yīng)用程序中,前臺(tái)與后臺(tái)的數(shù)據(jù)交互,都是通過(guò)HTML中Form表單完成的。Form提供了兩種數(shù)據(jù)傳輸?shù)姆绞?#8212;—get和post。雖然它們都是數(shù)據(jù)的提交方式,但是在實(shí)際傳輸時(shí)確有很大的不同,并且可能會(huì)對(duì)數(shù)據(jù)產(chǎn)生嚴(yán)重的影響。雖然為了方便的得到變量值,Web容器已經(jīng)屏蔽了二者的一些差異,但是了解二者的差異在以后的編程也會(huì)很有幫助的。
? Form中的get和post方法,在數(shù)據(jù)傳輸過(guò)程中分別對(duì)應(yīng)了HTTP協(xié)議中的GET和POST方法。二者主要區(qū)別如下:
? 1、Get是用來(lái)從服務(wù)器上獲得數(shù)據(jù),而Post是用來(lái)向服務(wù)器上傳遞數(shù)據(jù)。
? 2、Get將表單中數(shù)據(jù)的按照variable=value的形式,添加到action所指向的URL后面,并且兩者使用“?”連接,而各個(gè)變量之間使用“&”連接;Post是將表單中的數(shù)據(jù)放在form的數(shù)據(jù)體中,按照變量和值相對(duì)應(yīng)的方式,傳遞到action所指向URL。
? 3、Get是不安全的,因?yàn)樵趥鬏斶^(guò)程,數(shù)據(jù)被放在請(qǐng)求的URL中,而如今現(xiàn)有的很多服務(wù)器、代理服務(wù)器或者用戶代理都會(huì)將請(qǐng)求URL記錄到日志文件中,然后放在某個(gè)地方,這樣就可能會(huì)有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數(shù)據(jù),一些系統(tǒng)內(nèi)部消息將會(huì)一同顯示在用戶面前。Post的所有操作對(duì)用戶來(lái)說(shuō)都是不可見(jiàn)的。
? 4、Get傳輸?shù)臄?shù)據(jù)量小,這主要是因?yàn)槭躑RL長(zhǎng)度限制;而Post可以傳輸大量的數(shù)據(jù),所以在上傳文件只能使用Post(當(dāng)然還有一個(gè)原因,將在后面的提到)。
? 5、Get限制Form表單的數(shù)據(jù)集的值必須為ASCII字符;而Post支持整個(gè)ISO10646字符集。
? 6、Get是Form的默認(rèn)方法。 ?
GET 和 POST 的數(shù)據(jù)格式都是一樣的:
GET 支持的最大字節(jié)限制是 2048 Bytes
POST 支持的最大字節(jié)限制是 2GB
在表單里使用”post”和”get”有什么區(qū)別
在Form里面,可以使用post也可以使用get。它們都是method的合法取值。但是,post和get方法在使用上至少有兩點(diǎn)不同: 1、Get方法通過(guò)URL請(qǐng)求來(lái)傳遞用戶的輸入。Post方法通過(guò)另外的形式。 2、Get方式的提交你需要用Request.QueryString來(lái)取得變量的值,而Post方式提交時(shí),你必須通過(guò)Request.Form來(lái)訪問(wèn)提交的內(nèi)容。
仔細(xì)研究下面的代碼。你可以運(yùn)行之來(lái)感受一下:
代碼 <!--兩個(gè)Form只有Method屬性不同--> <FORM ACTION=“getpost.asp” METHOD=“get”> <INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT> <INPUT TYPE=“submit” VALUE=“Method=Get”></INPUT> </FORM> <BR> <FORM ACTION=“getpost.asp” METHOD=“post”> <INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT> <INPUT TYPE=“submit” VALUE=“Method=Post”></INPUT> </FORM>
<BR> <BR>
<% If Request.QueryString(“Text”) <> ““ Then %> 通過(guò)get方法傳遞來(lái)的字符串是: “<B><%= Request.QueryString(“Text”) %></B>“<BR> <% End If %>
<% If Request.Form(“Text”) <> ““ Then %> 通過(guò)Post方法傳遞來(lái)的字符串是: “<B><%= Request.Form(“Text”) %></B>“<BR> <% End If %>
說(shuō)明 把上面的代碼保存為getpost.asp,然后運(yùn)行,首先測(cè)試post方法,這時(shí)候,瀏覽器的url并沒(méi)有什么變化,返回的結(jié)果是: 通過(guò)Post方法傳遞來(lái)的字符串是: "Hello World" 然后測(cè)試用get方法提交,請(qǐng)注意,瀏覽器的url變成了: http://localhost/general/form/getpost.asp?Text=Hello+World 而返回的結(jié)果是: 通過(guò)get方法傳遞來(lái)的字符串是: "Hello World" 最后再通過(guò)post方法提交,瀏覽器的url還是: http://localhost/general/form/getpost.asp?Text=Hello+World 而返回的結(jié)果變成: 通過(guò)get方法傳遞來(lái)的字符串是: "Hello World" 通過(guò)Post方法傳遞來(lái)的字符串是: "Hello World"
提示 通過(guò)get方法提交數(shù)據(jù),可能會(huì)帶來(lái)安全性的問(wèn)題。比如一個(gè)登陸頁(yè)面。當(dāng)通過(guò)get方法提交數(shù)據(jù)時(shí),用戶名和密碼將出現(xiàn)在URL上。如果: 1、登陸頁(yè)面可以被瀏覽器緩存; 2、其他人可以訪問(wèn)客戶的這臺(tái)機(jī)器。 那么,別人即可以從瀏覽器的歷史記錄中,讀取到此客戶的賬號(hào)和密碼。所以,在某些情況下,get方法會(huì)帶來(lái)嚴(yán)重的安全性問(wèn)題。 建議 在Form中,建議使用post方法。 |