ViewState及其與Session的關係

2021-06-20 02:12:02 字數 2451 閱讀 1043

我們先來看深入分析一下viewstate, 為了分析的相對完整性,先從簡單的說起:

在asp時代, 大家都知道乙個html控制項的值,比如input 控制項值,當我們把表單提交到伺服器後, 頁面再刷

新回來的時候, input裡面的資料已經被清空. 這是因為web的無狀態性導致的, 服務端每次把html輸出到

客戶端後就不再於客戶端有聯絡.

asp.net巧妙的改變了這一點. 當我們在寫乙個asp.net表單時, 一旦標明了 form runat=server ,那

麼,asp.net就會自動在輸出時給頁面新增乙個隱藏域

那麼,有了這個隱藏域,頁面裡其他所有的控制項的狀態,包括頁面本身的一些狀態都會儲存到這個控制項值裡

面. 每次頁面提交時一起提交到後台,asp.net對其中的值進行解碼,然後輸出時再根據這個值來恢復各個

控制項的狀態. 我們再看這個控制項的value值,它可能類似如下的形式:oz4+o2w8atwxpjs+o2w8.... 

很多人會認為這是加密的資訊,其實不是, ms僅僅是給各個控制項和頁面的狀態存入適當的物件裡面,然後把

該物件序列化, 最後再做一次base64編碼,直接賦值給viewstate控制項.

說到這,想必你一定想看看這個viewstate裡面到底存了哪些東西, 嗯,你是可以寫乙個base64 to string

的轉換**來實現.不過,viewstate是有層次之分的,普通的轉換後,你看到的也是很亂的文字. 這裡提供

了乙個專門轉換viewstate值的地方 

. 你可以去

將自己的viewstate輸入進去,讓它給你轉化一下,這可是帶結構的哦 :)

好, 以上說的這些你可能會覺得: 這與session有什麼關係? 這個viewstate不是由asp.net自動去維護嗎?

是的, 如果僅僅是儲存控制項的狀態, 你可以感覺不到它與session有什麼瓜葛( 呵呵,其實它們就沒有瓜葛

),不過,接下來,我們看看這種使用方法: 在後台aspx.cs**裡:

private void page_load(object sender, system.eventargs e)

呵呵, 可以在頁面後台直接給viewstate集合賦值, 現在你是不是覺得和session的使用方法差不多了呢?

對,這一點就是幾乎所有初學asp.net的人的疑惑. 會認為asp.net也像session那樣把這個值儲存到伺服器

記憶體裡面, 其實不是!

那麼,這裡的viewstate值是屬於誰?又存在**? 其實,它和上面的其他控制項的狀態儲存一樣,也是儲存到

那個隱藏的viewstate控制項值裡面, 上面已經說了, viewstate用來儲存狀態,包括頁面本身, 那麼,這裡的

viewstate就屬於頁面本身的狀態.

分析到此,估計大家對viewstate的使用應該是沒有什麼疑問了. 那麼,我們可以來與session做一下模擬,

session值是儲存在伺服器記憶體上,那麼,可以肯定,大量的使用session將導致伺服器負擔加重. 而

viewstate由於只是將資料存入到頁面隱藏控制項裡,不再占用伺服器資源,因此, 我們可以將一些需要服務

器"記住"的變數和物件儲存到viewstate裡面. 而sesson則只應該應用在需要跨頁面且與每個訪問使用者相

關的變數和物件儲存上. 另外,session在預設情況下20分鐘就過期,而viewstate則永遠不會過期.

但viewstate並不是能儲存所有的.net型別資料,它僅僅支援string、integer、boolean、array、

arraylist、hashtable 以及自定義的一些型別.

當然,任何事物都有兩面性, 使用viewstate會增加頁面html的輸出量,占用更都的頻寬,這一點是需要我們

慎重考慮的. 另外, 由於所有的viewstate都是儲存在乙個隱藏域裡面,使用者可以很容易的通過檢視原始碼來

看到這個經過base64編碼的值.然後再經過轉換就可以獲取你儲存其中的物件和變數值.

其實,對於viewstate的安全性問題,asp.net還給我們提供了更多的選擇.一般如果要保護viewstate有兩種

方式: 一種是防篡改,一種是加密. 一說到防篡改,我們就想起了使用雜湊**. 沒錯, 我們可以在頁面頂

部加入如下**:page enableviewstatemac=true

這樣asp.net就會自動的在viewstate中追加乙個雜湊碼,在頁面回傳時,伺服器根據回傳的viewstate生成

乙個雜湊碼,再與回傳的雜湊碼相比較,如果不對,則丟棄該viewstate,同時控制項將恢復初試狀態. (預設情

況下asp.net是通過sha1演算法而不是md5演算法來生成雜湊,不過這個可以在machine.config裡面配置

machinekey validation="md5"即可)

而viewstate加密就更簡單了, 只要在machine.config裡設定一下machinekey validation="3des"即可實

現用des加密viewstate了.

http無狀態設計與Cookie和Session

無狀態指的是任意乙個web請求必須完全與其他請求隔離,當請求端提出請求時,請求本身包含了相應端為相應這一請求所需的全部資訊。1.被呼叫者不儲存引數,因為無需考慮引數邏輯 由使用者來儲存狀態,進行狀態邏輯設計 http是無狀態設計的,一些sdk的設計也可以是無狀態的。2.而一些需求是需要有互動的,需要...

HTTP無狀態協議之Cookie與Session!

在討論什麼是cookie和session之前要先了解http的無狀態協議。因為cookie與session是為了解決無狀態協議而誕生的。http的無狀態協議 當客戶端向伺服器發起請求並且在接收到伺服器返回給它的響應後,它就已經完成了一次傳輸的過程。這個過程是獨立的,也是乙個新的過程。如果客戶端下次再...

frame 與 iframe 及其區別

1.html5 不支援frame。2.iframe 可以單獨在任意位置。3.訪問iframe內物件的方法和普通一樣。iframe內訪問外部時用parent.4.注意target屬性。是根據iframe的name屬性來關聯的。5.iframe的src屬性是要顯示的資源的位址。這樣iframe顯示的就是...