日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ViewState與Session

系統(tǒng) 1824 0
昨天偶然看到網(wǎng)上有人討論究竟是該用viewstate還是session來(lái)保存信息. 忽然覺(jué)得有必要去深入的研究一下這兩個(gè)東東了.

我們先來(lái)看深入分析一下viewstate, 為了分析的相對(duì)完整性,先從簡(jiǎn)單的說(shuō)起:

在asp時(shí)代, 大家都知道一個(gè)html控件的值,比如input 控件值,當(dāng)我們把表單提交到服務(wù)器后, 頁(yè)面再刷新回來(lái)的時(shí)候, input里面的數(shù)據(jù)已經(jīng)被清空. 這是因?yàn)閣eb的無(wú)狀態(tài)性導(dǎo)致的, 服務(wù)端每次把html輸出到客戶端后就不再于客戶端有聯(lián)系.

asp.net巧妙的改變了這一點(diǎn). 當(dāng)我們?cè)趯懸粋€(gè)asp.net表單時(shí), 一旦標(biāo)明了 form runat=server ,那么,asp.net就會(huì)自動(dòng)在輸出時(shí)給頁(yè)面添加一個(gè)隱藏域

<input type="hidden" name="__VIEWSTATE" value="">

那么,有了這個(gè)隱藏域,頁(yè)面里其他所有的控件的狀態(tài),包括頁(yè)面本身的一些狀態(tài)都會(huì)保存到這個(gè)控件值里面. 每次頁(yè)面提交時(shí)一起提交到后臺(tái),asp.net對(duì)其中的值進(jìn)行解碼,然后輸出時(shí)再根據(jù)這個(gè)值來(lái)恢復(fù)各個(gè)控件的狀態(tài). 我們?cè)倏催@個(gè)控件的value值,它可能類似如下的形式:Oz4+O2w8aTwxPjs+O2w8....
很多人會(huì)認(rèn)為這是加密的信息,其實(shí)不是, ms僅僅是給各個(gè)控件和頁(yè)面的狀態(tài)存入適當(dāng)?shù)膶?duì)象里面,然后把該對(duì)象序列化, 最后再做一次base64編碼,直接賦值給viewstate控件.

說(shuō)到這,想必你一定想看看這個(gè)viewstate里面到底存了哪些東西, 嗯,你是可以寫一個(gè)base64 to string的轉(zhuǎn)換代碼來(lái)實(shí)現(xiàn).不過(guò),viewstate是有層次之分的,普通的轉(zhuǎn)換后,你看到的也是很亂的文字. 這里提供了一個(gè)專門轉(zhuǎn)換viewstate值的地方 http://www.wilsondotnet.com/Demos/ViewState.aspx . 你可以去將自己的viewstate輸入進(jìn)去,讓它給你轉(zhuǎn)化一下,這可是帶結(jié)構(gòu)的哦

好, 以上說(shuō)的這些你可能會(huì)覺(jué)得: 這與session有什么關(guān)系? 這個(gè)viewstate不是由asp.net自動(dòng)去維護(hù)嗎? 是的, 如果僅僅是保存控件的狀態(tài), 你可以感覺(jué)不到它與session有什么瓜葛( 呵呵,其實(shí)它們就沒(méi)有瓜葛),不過(guò),接下來(lái),我們看看這種使用方法: 在后臺(tái)aspx.cs代碼里:

private void Page_Load(object sender, System.EventArgs e)
{
ViewState["myvalue"] = "viewstatevalue";
//.....
}

呵呵, 可以在頁(yè)面后臺(tái)直接給viewstate集合賦值, 現(xiàn)在你是不是覺(jué)得和session的使用方法差不多了呢? 對(duì),這一點(diǎn)就是幾乎所有初學(xué)asp.net的人的疑惑. 會(huì)認(rèn)為asp.net也像session那樣把這個(gè)值保存到服務(wù)器內(nèi)存里面, 其實(shí)不是!

那么,這里的viewstate值是屬于誰(shuí)?又存在哪里? 其實(shí),它和上面的其他控件的狀態(tài)保存一樣,也是存儲(chǔ)到那個(gè)隱藏的viewstate控件值里面, 上面已經(jīng)說(shuō)了, viewstate用來(lái)保存狀態(tài),包括頁(yè)面本身, 那么,這里的viewstate就屬于頁(yè)面本身的狀態(tài).

分析到此,估計(jì)大家對(duì)viewstate的使用應(yīng)該是沒(méi)有什么疑問(wèn)了. 那么,我們可以來(lái)與session做一下類比, session值是保存在服務(wù)器內(nèi)存上,那么,可以肯定,大量的使用session將導(dǎo)致服務(wù)器負(fù)擔(dān)加重. 而viewstate由于只是將數(shù)據(jù)存入到頁(yè)面隱藏控件里,不再占用服務(wù)器資源,因此, 我們可以將一些需要服務(wù)器"記住"的變量和對(duì)象保存到viewstate里面. 而sesson則只應(yīng)該應(yīng)用在需要跨頁(yè)面且與每個(gè)訪問(wèn)用戶相關(guān)的變量和對(duì)象存儲(chǔ)上. 另外,session在默認(rèn)情況下20分鐘就過(guò)期,而viewstate則永遠(yuǎn)不會(huì)過(guò)期.

但viewstate并不是能存儲(chǔ)所有的.net類型數(shù)據(jù),它僅僅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定義的一些類型.

當(dāng)然,任何事物都有兩面性, 使用viewstate會(huì)增加頁(yè)面html的輸出量,占用更都的帶寬,這一點(diǎn)是需要我們慎重考慮的. 另外, 由于所有的viewstate都是存儲(chǔ)在一個(gè)隱藏域里面,用戶可以很容易的通過(guò)查看源碼來(lái)看到這個(gè)經(jīng)過(guò)base64編碼的值.然后再經(jīng)過(guò)轉(zhuǎn)換就可以獲取你存儲(chǔ)其中的對(duì)象和變量值.

其實(shí),對(duì)于viewstate的安全性問(wèn)題,asp.net還給我們提供了更多的選擇.一般如果要保護(hù)viewstate有兩種方式: 一種是防篡改,一種是加密. 一說(shuō)到防篡改,我們就想起了使用散列代碼. 沒(méi)錯(cuò), 我們可以在頁(yè)面頂部加入如下代碼:Page EnableViewStateMAC=true

這樣asp.net就會(huì)自動(dòng)的在viewstate中追加一個(gè)散列碼,在頁(yè)面回傳時(shí),服務(wù)器根據(jù)回傳的viewstate生成一個(gè)散列碼,再與回傳的散列碼相比較,如果不對(duì),則丟棄該viewstate,同時(shí)控件將恢復(fù)初試狀態(tài). (默認(rèn)情況下asp.net是通過(guò)SHA1算法而不是md5算法來(lái)生成散列,不過(guò)這個(gè)可以在machine.config里面配置machineKey validation="MD5"即可)

而viewstate加密就更簡(jiǎn)單了, 只要在machine.config里設(shè)置一下machineKey validation="3DES"即可實(shí)現(xiàn)用des加密viewstate了.

ViewState與Session


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 黔江区| 平陆县| 凤台县| 千阳县| 家居| 自贡市| 阳信县| 赣州市| 崇礼县| 巧家县| 承德县| 临泉县| 汝南县| 平度市| 东兰县| 密山市| 奉贤区| 肇源县| 新乡市| 双牌县| 太康县| 丹阳市| 古浪县| 天气| 揭东县| 文安县| 沈丘县| 鄱阳县| 万源市| 太和县| 禹城市| 甘南县| 临澧县| 邻水| 和龙市| 岳西县| 库尔勒市| 黄浦区| 尤溪县| 霍山县| 汝阳县|