<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心有多大舞臺便有多大

    Embrace changes, pursue excellence, share niceness.

    [ZZ]理解form的get和post

    (轉載自http://askjava.blog.sohu.com/76540166.html)

    HTML中,form元素

    1. get和post的定義

    W3CHTML 4.01 specification說,form元素的method屬性用來指定發送form的HTTP方法。

    • 使用get時,form的數據集(形如control-name=current-value的鍵值對)被附加到form元素的action屬性所指定的URI后面;
    • 使用post時,form的數據集(形如control-name=current-value的鍵值對)被包裝在請求的body中并被發送。

    這可以簡單地理解為,get僅僅是拼接一個URI,然后直接向服務器請求數據(需要提交給服務器的數據集包含在URI中)。比如:

    <form method="get" action="FormGet.aspx">
        
    <input type="text" name="ProductID" value="1" />
        
    <input type="submit" value="Get" />
    </form>

    這個form在提交的時候,會產生這樣能夠一個get請求:FormGet.aspx?ProductID=1。

    而post會把form的數據集,即ProductID=1這個鍵值對包裝在請求的body中,發送給服務器,然后向服務器請求數據。對于:

    <form method="post" action="FormPost.aspx">
        
    <input type="text" name="ProductID" value="1" />
        
    <input type="submit" value="Get" />
    </form>

    這樣一個form在提交時,我們將看到一個干凈的URI:FormPost.aspx。因為數據不是拼接在URI中。

    2. get和post的區別

    2.1 安全性

    如果用get提交一個驗證用戶名和密碼的form,一般認為是不安全的。因為用戶名和密碼將出現在URL上,進而出現在瀏覽器的歷史記錄中。顯然,在對安全性有要求的情況下,應該使用post。

    2.2 編碼

    HTML 4.01 specification指出,get只能向服務器發送ASCII字符,而post則可以發送整個ISO10646中的字符(如果同時指定

    注意get和post對應的enctype屬性有區別。enctype有兩個值,默認值為application/x-www-form-urlencoded,而另一個值multipart/form-data只能用于post。

    2.3 提交的數據的長度

    HTTP specification并沒有對URL長度進行限制,但是IE將請求的URL長度限制為2083個字符,從而限制了get提交的數據長度。測試表明如果URL超出這個限制,提交form時IE不會有任何響應。其它瀏覽器則沒有URL的長度限制,因此其它瀏覽器能通過get提交的數據長度僅受限于服務器的設置。

    而對于post,因為提交的數據不在url中,所以通常可以簡單地認為數據長度限制僅受限于服務器的設置。

    2.4 緩存

    由于一個get得到的結果直接對應到一個URI,所以get的結果頁面有可能被瀏覽器緩存。而post一般則不能,參考5。

    2.5 引用和SEO

    出于和上面相同的原因,我們可以用一個URI引用一個get的結果頁面,而post的結果則不能,所以必然不能被搜索引擎搜到。

    3. 服務端的處理

    在服務端的ASP.NET程序中,對于get,我們用Request.QueryString[control-name]來取得對應的=current-value;對于post,我們用Request.Form[control-name]。

    我們也可以籠統地使用Request[control-name]。但這樣做的效率不如前者。我們可以用下面的程序比較Request.QueryString和Request的效率:

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        protected 
    void Page_PreInit(object sender, EventArgs e)
        {
            
    if(Request["InputString"!= null)
            {
                
    int count = 1000000;
                DateTime start;
                DateTime end;
                string value 
    = "";
                start 
    = DateTime.Now;
                
    for(int i = 0;i < count;i++)
                {
                    value 
    = Request.QueryString["InputString"];
                }
                end 
    = DateTime.Now;
                
    double requestGet = (end - start).TotalSeconds;
                start 
    = DateTime.Now;
                
    for(int i = 0;i < count;i++)
                {
                    value 
    = Request["InputString"];
                }
                end 
    = DateTime.Now;
                
    double request = (end - start).TotalSeconds;
                compare.InnerHtml 
    = requestGet.ToString() + " / " + request.ToString() + " = " + (requestGet / request).ToString();
                get.InnerHtml 
    = value;
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
        
    <head>
            
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            
    <title>Request.QueryString / Request</title>
        
    </head>
        
    <body>
            
    <form method="get" action="FormGet.aspx">
                
    <div>
                    
    <input type="text" name="InputString" /><input type="submit" value="Post" /><br />
                    Get: 
    <span runat="server" id="get"></span><br />
                    Request.QueryString / Request: 
    <span runat="server" id="compare"></span>
                
    </div>
            
    </form>
        
    </body>
    </html>

    同樣的辦法我們可以比較Request.Form和Request。

    最后得到的結果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多數時候是小于1的。因此,我們因該盡量用Request.QueryString或Request.Form來代替Request。

    4. 正確地使用get和post

    W3C的官方建議是:當且僅當form是冪等(idempotent)的時候,使用get。冪等是一個數學上的術語,其定義是:對于一個函數f : D -> D,如果D中的所有x滿足f (f x) = f x,那么這個函數是冪等的。HTTP specification(比如RFC 2616)中,將冪等解釋為:多次相同請求產生的副作用,和一次請求的副作用相同。

    打個比方,如果你提交一個form會從Google上查詢一個關鍵詞,那么我們可以認為這個form是冪等的,因為1次提交和10次提交的副作用是差不多的(10次查詢可能會多消耗一些電能);如果你提交一個form是訂購一個終極大黃蜂(Utimate bumblebee),那么這就不是冪等的:要是你不小心多提交了1次form的話,你可能會被老婆亂罵,你不小心又提交了10次的話,你可能就破產了——一次提交和多次提交的副作用明顯不同,所以這不是冪等的。

    所以,一般來說,如果提交這個請求純粹只是從服務端獲取數據而不進行其他操作,并且多次提交不會有明顯的副作用,應該使用get。比如:

    如果提交這個請求會產生其它操作和影響,就應該使用post。比如:

    • 修改服務器上數據庫中的數據;
    • 發送一封郵件;
    • 刪除一個文件。

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

    5. 瀏覽器差異

    6. 參考

    posted on 2010-03-15 11:20 pony 閱讀(516) 評論(0)  編輯  收藏 所屬分類: 網站

    主站蜘蛛池模板: 一级毛片成人免费看免费不卡| 羞羞视频免费网站在线看| 99国产精品永久免费视频 | 国产免费AV片无码永久免费| 亚洲日韩精品国产一区二区三区 | 91麻豆国产自产在线观看亚洲| 成人免费夜片在线观看| 免费人成激情视频| 十八禁的黄污污免费网站| 亚洲国产中文字幕在线观看| 免费在线人人电影网| 亚洲区日韩区无码区| 国产免费无码一区二区| 久久精品国产亚洲AV电影| 中文字幕无码播放免费| 亚洲人成人伊人成综合网无码| 国产99视频免费精品是看6| 九九久久精品国产免费看小说| 亚洲小说区图片区另类春色| 黄色片免费在线观看| 亚洲中字慕日产2020| 四虎永久成人免费| 巨胸狂喷奶水视频www网站免费| 亚洲AV无码一区二区乱子伦| 免费成人福利视频| 美女黄频a美女大全免费皮| 亚洲日韩精品一区二区三区 | 大地资源网高清在线观看免费| 亚洲视频一区在线观看| 暖暖日本免费在线视频| 国产精品综合专区中文字幕免费播放| 欧洲亚洲国产清在高| 中文字幕无码视频手机免费看 | 成人永久福利免费观看| 搜日本一区二区三区免费高清视频 | 亚洲成人福利网站| 免费大片黄手机在线观看| 免费成人在线视频观看| 亚洲GV天堂GV无码男同| 亚洲精品乱码久久久久久中文字幕 | 成年午夜视频免费观看视频|