ASP.NET的HtmlForm控件學習及Post與Get的區(qū)別概述
一、前言
1、了解HTTP(hypertext transport protocol)超文本傳輸協議
它是一種分布式,協作式,超媒體系統應用之間的通信協議。是萬維網(world wide web)交換信息的基礎。它以HTML文檔從web服務器傳到web瀏覽器的方式進行的,如下圖解:

HTTP工作在TCP/IP協議體系中的TCP協議上。我們可以引出TCP/IP協議層級模型,如下圖:

HTTP請求的方法如下:
(1).OPTIONS:返回服務器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務器發(fā)送'*'的請求來測試服務器的功能性?!?BR>(2).HEAD:向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應消息頭中的元信息。
(3).GET:向特定的資源發(fā)出請求。注意:GET方法不應當被用于產生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問?!?BR>(4).POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改?!?BR>(5).PUT:向指定資源位置上傳其最新內容。
(6).DELETE: 請求服務器刪除Request-URI所標識的資源。
(7).TRACK: 回顯服務器收到的請求,主要用于測試或診斷。
2.表單提交原理
這里引述了大牛們的總結:
(1).表單提交時表單內容會被瀏覽器封裝為HTTP請求報,里面包含了所有表單元素的name屬性值和value屬性的值,形式為name=value。
(2).該HTTP請求報被webserver獲取后會被解析并封裝成一個Request對象,Request對象里有一個Parameters集合專門用來存放所有的表單元素名值對。
(3).每個表單元素名值對被封裝成一個Parameter,而Parameter其實就是一個Map,所以你的Servlet里就可以用request.getParameter(name)獲取其value了。
既然大牛們都說的很清楚了,那么我們還需要清除的是表單靠什么進行提交的,在這里表單標簽有個很重要的屬性就是enctype,它設置以何種編碼方式提交表單數據。有以下三種:
(1).application/x-www-form-urlencoded:這是默認的編碼方式,通過Value值的方式進行數據處理 [這個我還是模糊的](2).multipart/form-data:是以二進制流的方式來處理表單數據
(3).text/plain:當表單的action屬性值為mailto:URL的形式時使用,多用于直接通過表單發(fā)送郵件
二、HtmlForm控件
1.HtmlForm 控件用于控制 <form> 元素,主要屬性如下:
| 屬性 | 描述 |
|---|---|
| Action |
URL,定義當提交表單時把數據送往何處。注釋:該屬性總是設置為頁面自身的 URL! |
| Attributes | 返回該元素的所有屬性名稱和值對。 |
| Disabled | 布爾值,指示是否禁用該控件。默認是 false。 |
| EncType | 用來編碼表單內容的 MIME 類型。 |
| id | 控件的唯一 id。 |
| InnerHtml |
設置或返回該 HTML 元素的開始標簽和結束標簽之間的內容。特殊字符不會被自動轉換為 HTML 實體。 |
| InnerText |
設置或返回該 HTML 元素的開始標簽和結束標簽之間的所有文本。特殊字符會被自動轉換為 HTML 實體。 |
| Method | 表單向服務器傳送數據的方式。合法的值是 "post" 和 "get"。默認是 "post"。 |
| Name | 表單的名稱。 |
| runat | 規(guī)定該控件是一個服務器控件。必須被設置為 "server"。 |
| Style | 設置或返回被應用到控件的 CSS 屬性。 |
| TagName | 返回元素的標簽名。 |
| Target | 加載 URL 的目標窗口。 |
| Visible | 布爾值,指示該控件是否可見。 |
Method:Post / Get;其中的差別是Get表示由瀏覽器主動上傳資料至Server 端,是立即傳送,其執(zhí)行效率快但是傳送的數據量也不能太大;而Post表示由服務器來抓取數據,雖然不是那么立即,但是可傳送的數據量則沒有什么限制。
Action:要提交數據的頁面,即數據要傳送至哪個網址。
2.Post與Get的區(qū)別:
http://jb51.net/web/72554.html
Form提供了兩種數據傳輸的方式——get和post。雖然它們都是數據的提交方式,但是在實際傳輸時確有很大的不同,并且可能會對數據產生嚴重的影響。雖然為了方便的得到變量值,Web容器已經屏蔽了二者的一些差異,但是了解二者的差異在以后的編程也會很有幫助的。
Form中的get和post方法,在數據傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區(qū)別如下:
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字符集。
6、Get是Form的默認方法。
使用Post傳輸的數據,可以通過設置編碼的方式正確轉化中文;而Get傳輸的數據卻沒有變化。在以后的程序中,我們一定要注意這一點。
1、Get 方法通過 URL 請求來傳遞用戶的數據,將表單內各字段名稱與其內容,以成對的字符串連接,置于 action 屬性所指程序的 url 后,如http://www.mdm.com/test.asp?name=asd&password=sad,數據都會直接顯示在 url 上,就像用戶點擊一個鏈接一樣;Post 方法通過 HTTP post 機制,將表單內各字段名稱與其內容放置在 HTML 表頭(header)內一起傳送給服務器端交由 action 屬性能所指的程序處理,該程序會通過標準輸入(stdin)方式,將表單的數據讀出并加以處理2、 Get 方式需要使用 Request.QueryString 來取得變量的值;而 Post 方式通過 Request.Form 來訪問提交的內容
3、Get 方式傳輸的數據量非常小,一般限制在 2 KB 左右,但是執(zhí)行效率卻比 Post 方法好;而 Post 方式傳遞的數據量相對較大,它是等待服務器來讀取數據,不過也有字節(jié)限制,這是為了避免對服務器用大量數據進行惡意攻擊,根據微軟方面的說法,微軟對用 Request.Form() 可接收的最大數據有限制,IIS 4 中為 80 KB 字節(jié),IIS 5 中為 100 KB 字節(jié)建議:除非你肯定你提交的數據可以一次性提交,否則請盡量用 Post 方法
4、Get 方式提交數據,會帶來安全問題,比如一個登陸頁面,通過 Get 方式提交數據時,用戶名和密碼將出現在 URL 上,如果頁面可以被緩存或者其他人可以訪問客戶這臺機器,就可以從歷史記錄獲得該用戶的帳號和密碼,所以表單提交建議使用 Post 方法;Post 方法提交的表單頁面常見的問題是,該頁面如果刷新的時候,會彈出一個對話框建議:出于安全性考慮,建議最好使用 Post 提交數據
關于ASP.NET的HtmlForm 控件這點弄明白之后,那么在后期的ASP.NET上傳控件、Request獲取窗體變量就能很容易的去理解了。再者,關于Get與Post的區(qū)別,甚是關鍵,去年面試的時候就因為這點沒有很好地回答上而被潛回,看來以后還是要把基礎的東西弄熟透、打扎實才能為后面的道路順利開展工作。
相關文章
Web系統通過EXE文件實現讀取客戶電腦MAC等硬件信息且兼容非IE瀏覽器
我們在實際Web應用中,可能會遇到“需要限定特定的電腦或用戶才能使用系統”的問題。2014-08-08
.NET使用YARP通過編碼方式配置域名轉發(fā)實現反向代理
這篇文章介紹了.NET使用YARP通過編碼方式配置域名轉發(fā)實現反向代理的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

