国产精品毛片一区二区,欧美熟妇brazzers,丰满女邻居的嫩苞张开视频,天天爽夜夜爽夜夜爽

南京北大青鳥(niǎo)

全國(guó)咨詢(xún)電話(huà):15195455103

三分鐘了解北大青鳥(niǎo)
當(dāng)前位置:南京北大青鳥(niǎo) > 學(xué)習(xí)園地 > 編程技巧

淺談ViewState、Cookie和Session

來(lái)源:南京北大青鳥(niǎo)張府園校區(qū)? ? ? 作者:IT教育 ? ??

常見(jiàn)的基礎(chǔ)概念,ViewState、Cookie和Session的描述似乎都太復(fù)雜和書(shū)面化,沒(méi)有達(dá)到我想象中的簡(jiǎn)單(注1)。既然覺(jué)得別人說(shuō)的不簡(jiǎn)單或者讓事情變得更難以理解和應(yīng)用,那么就該自己進(jìn)行
常見(jiàn)的基礎(chǔ)概念,ViewState、Cookie和Session的描述似乎都太復(fù)雜和書(shū)面化,沒(méi)有達(dá)到我想象中的簡(jiǎn)單(注1)。既然覺(jué)得別人說(shuō)的不簡(jiǎn)單或者讓事情變得更難以理解和應(yīng)用,那么就該自己進(jìn)行總結(jié),即是為了自己,也是為了別人(注2)。所以我嘗試從我個(gè)人的角度進(jìn)行分析,希望能起到加深自己理解和減少別人誤解的作用。
概述
1.HTTP協(xié)議是無(wú)狀態(tài)的。Web服務(wù)器處理完一次請(qǐng)求后立即斷開(kāi)連接,因此即使同一訪(fǎng)客同一瀏覽器進(jìn)程,仍然無(wú)法被服務(wù)器端識(shí)別。
2.請(qǐng)求之間需要共享數(shù)據(jù)。共享數(shù)據(jù)后,才可以實(shí)現(xiàn)辨別身份、保持狀態(tài)、個(gè)性化等。即使匿名用戶(hù)也有避免重新輸入、復(fù)合條件檢索等作用。
請(qǐng)求之間可以通過(guò)3種方式達(dá)到共享數(shù)據(jù)的目的: 1.基于頁(yè)面:表單元素(ViewState)&URL參數(shù)。 2.基于客戶(hù)端:cookie。3.基于服務(wù)器+客戶(hù)端:session。這三種方式與服務(wù)器采用那種技術(shù)是無(wú)關(guān)的。
簡(jiǎn)單說(shuō)說(shuō)這3種方式:ViewState受瀏覽器進(jìn)程時(shí)間限制,無(wú)法完成超出瀏覽器進(jìn)程的狀態(tài)保存。cookie可以不受時(shí)間限制但受存儲(chǔ)數(shù)據(jù)大小限制,僅能保存少量數(shù)據(jù)。session不受時(shí)間和大小限制,但受服務(wù)器資源限制,因?yàn)閟ession無(wú)論是存儲(chǔ)在內(nèi)存、還是以文件或數(shù)據(jù)庫(kù)方式存儲(chǔ)都會(huì)對(duì)服務(wù)器效率造成影響。但只有session才能滿(mǎn)足某些網(wǎng)站在狀態(tài)數(shù)據(jù)存儲(chǔ)的規(guī)模和安全性的要求。
1.基于頁(yè)面
基于頁(yè)面的方式可以在POST訪(fǎng)問(wèn)時(shí)通過(guò)表單元素(input hidden)傳遞數(shù)據(jù),可以通過(guò)在附加URL參數(shù)傳遞數(shù)據(jù)?;陧?yè)面的方式強(qiáng)大的地方在于即使客戶(hù)端禁用了cookie或javascript,仍對(duì)服務(wù)器解析不構(gòu)成影響。ASP.NET的ViewState只是基于頁(yè)面?zhèn)鬟f的一種應(yīng)用。ASP.NET頁(yè)面將整個(gè)頁(yè)面視為一個(gè)包含了所有服務(wù)器控件的Web Form,默認(rèn)的POST的URL只能是當(dāng)前頁(yè)。ViewState原本是可以跨頁(yè)傳遞的,但由于ASP.NET頁(yè)面模型所限,只能起到POST當(dāng)前頁(yè)面后維護(hù)頁(yè)面數(shù)據(jù)的作用。 在開(kāi)始的ASP.NET事件模型中,你無(wú)法POST到其他頁(yè)面。Response.Redirect()還是Server.Transfer()都不可以,前者先POST回當(dāng)前頁(yè)后采用頁(yè)面重定向,即使你Redirect到自身也還是重定向,后者POST到當(dāng)前頁(yè)后再采用其他頁(yè)進(jìn)行請(qǐng)求處理,雖然返回了其他頁(yè)的內(nèi)容,但瀏覽器中的URL甚至都不會(huì)改變。到了ASP.NET 2.0才對(duì)客戶(hù)端提交表單前通過(guò)javascript強(qiáng)制POST到其他頁(yè)的方式實(shí)現(xiàn)了客戶(hù)端POST。而Web Form的action還是當(dāng)前頁(yè)面??赡芪④浺矎奈聪脒^(guò)在其他頁(yè)面使用ViewState的需要,所以給該屬性設(shè)置了protected的保護(hù)??墒抢碚撋?,基于頁(yè)面的方式,無(wú)論是通過(guò)附加表單元素還是URL參數(shù),都可以達(dá)到一致的效果。
不討論ASP.NET這種Web Form模型的弊利,我們?nèi)绻枰紤]客戶(hù)端禁用了Cookie和JavaScript的情況(一般無(wú)需考慮),采用基于頁(yè)面的方式仍可以幫我們解決兩次請(qǐng)求之間共享數(shù)據(jù)的目的。 在工作經(jīng)驗(yàn)里,曾有一個(gè)PHP的多子站點(diǎn)的純信息展示類(lèi)網(wǎng)站,由于唯一的用戶(hù)就是維護(hù)該網(wǎng)站的編輯,編輯需要在訪(fǎng)問(wèn)網(wǎng)站時(shí),對(duì)需要修改的地方直接修改,因此采用了ViewState的方式達(dá)到目的,根據(jù)是否登錄來(lái)決定是否加載啟用在線(xiàn)編輯的javascript文件,加載后每個(gè)區(qū)域雙擊即可彈出編輯框,編輯后即使提交通不過(guò)仍可繼續(xù)修改而不會(huì)丟失信息。
2.基于客戶(hù)端
cookie是客戶(hù)端技術(shù),服務(wù)器采用動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)可以從客戶(hù)端讀取請(qǐng)求附加的cookie和向客戶(hù)端傳遞cookie,達(dá)到了在請(qǐng)求之間共享數(shù)據(jù)的目的。cookie的本身有著大小的限制,而即使沒(méi)有限制,攜帶過(guò)大的cookie對(duì)于請(qǐng)求的往返來(lái)說(shuō)也是沉重的負(fù)擔(dān)。cookie是應(yīng)用廣泛的維持狀態(tài)的方式。由于cookie使用HTTP請(qǐng)求頭和響應(yīng)頭進(jìn)行發(fā)送和接受,因此是一種服務(wù)器無(wú)關(guān)的技術(shù)。
3.基于服務(wù)器+客戶(hù)端
cookie可以設(shè)置過(guò)期時(shí)間,比基于頁(yè)面的技術(shù)更靈活,但只憑借客戶(hù)端的cookie進(jìn)行驗(yàn)證安全性存在隱患,而cookie的存儲(chǔ)大小又有限制,因此利用服務(wù)器端進(jìn)行存儲(chǔ)擴(kuò)充和驗(yàn)證,這便是session技術(shù)。ASP.NET、PHP等都內(nèi)置了對(duì)session的實(shí)現(xiàn),一些大型的網(wǎng)站和框架也提供了自己的session的實(shí)現(xiàn)用于滿(mǎn)足各自的需求。大多數(shù)我們所見(jiàn)的網(wǎng)站,都使用了session技術(shù)。ASP.NET默認(rèn)的session使用服務(wù)器內(nèi)存存儲(chǔ)(通過(guò)Page.Session屬性使用,通過(guò)不同的會(huì)話(huà)提供程序,也可以用數(shù)據(jù)庫(kù)或其他的方式存儲(chǔ)),PHP默認(rèn)的方式以服務(wù)器端文本存儲(chǔ)(同樣也支持內(nèi)存或數(shù)據(jù)庫(kù)等自定義方式)。
如何使用?
其實(shí)ViewState、Cookie和Session在不同程度上解決不同請(qǐng)求之間的數(shù)據(jù)共享問(wèn)題,這3種方式與服務(wù)器端采用的是PHP還是ASP.NET無(wú)關(guān),這一點(diǎn)尤為重要。ViewState一般采用在頁(yè)面表單的源代碼中保存數(shù)據(jù),其限制可想而知,不過(guò)用來(lái)完成類(lèi)似防止表單出錯(cuò)重填的功能還是沒(méi)問(wèn)題的。cookie采取在客戶(hù)端以文本方式存放,雖然數(shù)據(jù)大小受限制且安全存在隱患,但存儲(chǔ)少量用戶(hù)信息還是足夠用的。session可以看做是對(duì)cookie的加強(qiáng)(不考慮基于url的session),在服務(wù)器端二次驗(yàn)證,增強(qiáng)了安全性,利用服務(wù)器端資源,可以存儲(chǔ)大量數(shù)據(jù)。這樣看來(lái),完全搞不懂為什么會(huì)出現(xiàn)對(duì)某個(gè)具體的網(wǎng)站有采用那種方式的糾結(jié)心態(tài)。
1.ViewState用于共享頁(yè)面狀態(tài)數(shù)據(jù)可以考慮,即使服務(wù)器端沒(méi)有直接支持,只要采用的是動(dòng)態(tài)網(wǎng)頁(yè)技術(shù),可以很容易實(shí)現(xiàn)。
2.Cookie一般可以滿(mǎn)足用戶(hù)ID、角色、個(gè)性化信息的簡(jiǎn)單存儲(chǔ)。
3.Session對(duì)于電子商務(wù)類(lèi)網(wǎng)站或需要通過(guò)一系列想到頁(yè)面完成某個(gè)任務(wù)的網(wǎng)站來(lái)說(shuō)較為實(shí)用,因?yàn)閱渭兪褂肅ookie這時(shí)從存儲(chǔ)數(shù)據(jù)的大小和安全性上來(lái)說(shuō),都很難勝任。
服務(wù)器端無(wú)論是采用ASP.NET還是PHP等,一般都會(huì)默認(rèn)支持Session。但內(nèi)置的Session可能會(huì)有各種各樣的問(wèn)題,所以不要拿內(nèi)置的Session來(lái)否定Session這種方式的必要性。
一個(gè)銷(xiāo)售虛擬游戲物品的網(wǎng)站,雖然同時(shí)在線(xiàn)人數(shù)不是很多,但由于其單個(gè)訂單包含的信息量,Cookie方式是根本無(wú)法滿(mǎn)足的。單位內(nèi)部的查詢(xún)網(wǎng)站,采用Cookie存儲(chǔ)用戶(hù)ID和角色,完全夠用。
如果一個(gè)網(wǎng)站Cookie足可以滿(mǎn)足,那么搞不懂為什么要用Session。如果一個(gè)網(wǎng)站Session方式才能滿(mǎn)足需要,搞不懂怎么拋棄Session方式。曾就職于一個(gè)以虛擬物品網(wǎng)上交易作為主要業(yè)務(wù)的公司,其訪(fǎng)客無(wú)論是否注冊(cè)都可以將商品放入購(gòu)物車(chē)中,很多wow的商品包含很多自定義參數(shù)可供客戶(hù)調(diào)節(jié),無(wú)論注冊(cè)與否都可以生成預(yù)付訂單,對(duì)于未注冊(cè)用戶(hù),即使關(guān)閉瀏覽器的之內(nèi),都可以再次訪(fǎng)問(wèn)時(shí)查看加入到訂單中的商品,難以想象不使用session方式如何正常工作。如果說(shuō)在cookie中只存儲(chǔ)必要的key,再訪(fǎng)問(wèn)時(shí)從服務(wù)器中獲取,這本身就是session的定義。
沒(méi)有session實(shí)際使用的經(jīng)歷,站在可以使用cookie就可以滿(mǎn)足需求的前提下去研究session方式在某個(gè)具體技術(shù)下的實(shí)現(xiàn)的缺點(diǎn)而直接否定session是沒(méi)有意義的,這如同使用扁平結(jié)構(gòu)靜態(tài)頁(yè)的角度來(lái)抨擊樹(shù)形結(jié)構(gòu)靜態(tài)頁(yè)網(wǎng)站的物理結(jié)構(gòu)一樣。
小結(jié)
搞清某些技術(shù)的局限性,來(lái)分析是否滿(mǎn)足我們的實(shí)際需求,就不會(huì)把目光局限于技術(shù)本身的比較上。
所以,不要把簡(jiǎn)單的問(wèn)題搞復(fù)雜。實(shí)踐重要。本來(lái)就是為了在兩次請(qǐng)求之間傳遞狀態(tài)數(shù)據(jù),無(wú)論請(qǐng)求頁(yè)面是否是同一頁(yè)面,只需要考慮低限度那種方式可滿(mǎn)足即可。如果不了解cookie的基礎(chǔ)知識(shí),請(qǐng)自行baidu或google;如果看了概述就猜到我要說(shuō)什么,那你在實(shí)際工作中有過(guò)應(yīng)用。
關(guān)注我們要解決的問(wèn)題,讓本來(lái)簡(jiǎn)單的問(wèn)題簡(jiǎn)單。譬如Web服務(wù)器上都是靜態(tài)文件,URL包含了文件的路徑和文件名,甚至連URL參數(shù)都無(wú)法處理,只能采取客戶(hù)端javascript的偽過(guò)濾方式控制內(nèi)容的顯示。后來(lái)的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)可以在服務(wù)器端處理URL參數(shù)并根據(jù)請(qǐng)求動(dòng)態(tài)生成內(nèi)容,而后MVC方式出現(xiàn),URL從直接對(duì)應(yīng)路徑和文件名到映射Controller和Action??墒莾烧叩膮^(qū)別只在于看待問(wèn)題的角度不同,沒(méi)有任何一種是另一種完全可以替代的,或者說(shuō),重點(diǎn)應(yīng)該是能否恰到好處的解決問(wèn)題。不要討論Web Form和ASP.NET MVC哪個(gè)好,在PHP早就可以任意匹配邏輯結(jié)構(gòu)和物理結(jié)構(gòu),動(dòng)態(tài)技術(shù)是否支持URL映射只是邏輯結(jié)構(gòu)和物理結(jié)構(gòu)映射的問(wèn)題(幾年前寫(xiě)一個(gè)只通過(guò)一個(gè)入動(dòng)態(tài)頁(yè)入口,實(shí)現(xiàn)多個(gè)站點(diǎn)的方式,邏輯結(jié)構(gòu)是分類(lèi)+文章名,訪(fǎng)問(wèn)時(shí)URL也是如此,但物理結(jié)構(gòu)只有一個(gè)PHP文件作為入口,所有內(nèi)容全部存儲(chǔ)在mysql數(shù)據(jù)庫(kù)中,因?yàn)樾枨笠罂梢酝ㄟ^(guò)數(shù)據(jù)庫(kù)備份整個(gè)網(wǎng)站,可以直接在幾十個(gè)網(wǎng)站中執(zhí)行對(duì)內(nèi)容的批量操作,讓我對(duì)邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的映射一下子所得甚多),影響不到你對(duì)業(yè)務(wù)模型的抽象,對(duì)行為接口的提取和對(duì)業(yè)務(wù)流程的處理。
注1:簡(jiǎn)單原則;注2:行動(dòng)原則。

分享到:
近期文章

搶試聽(tīng)名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES