ASP.NET狀態保存分為客戶端保存和服務器端保存兩種:
使用客戶端選項存儲頁信息而不使用服務器資源的這些選項往往具有最低的安全性但具有最快 的服務器性能,因為對服務器資源的要求是適度的。但是,由於必須將信息發送到客戶端來進行存儲,因此對於以這種方式可以存儲多少信息存在一定的客觀限制。
客戶端保存的方式一般有如下4種:
1、ViewState:
利用場合為:在對同一頁的多個請求間自動保留值,多用於客戶端的一些事件。,典型利用場合為:頁面信息重置, 登陸出錯次數統計,Grid列排序等。
優點:不利用服務器端資源,實現簡單,相對高的安全性:因為經過哈希計算和壓縮,並且針對 Unicode 實現進行編碼。
缺點:因為ViewState存儲在頁面本身,所以無法存儲較大的值。並且通過源文件可以看見其中的值 ,雖然經過哈希計算和壓縮,但仍有被篡改的風險。
可存儲的類型:string,integer,bool,array,arr aylist,hashtable以及其他可以序列化的類型。
2、HiddenField:
利用場合為:存儲少量頁面 中經常改動的信息,多和客戶端腳本一塊使用,典型利用場合為:客戶端經歷一系列驗證之後向服務器端回發,服務器端從客戶端HiddenField中獲取值,進行處理。例如 :LeyserHomepage中,要刪除一項產品,需要在客戶端彈出確認Form,用戶確認之後再PostBac k回服務器端進行數據庫Delete操作,當用戶確認要刪除時,將當前要刪除的產品ID存放到一個HiddenField中,然後執行 Form(0).submit回發到服務器端,服務器端再從HiddenField獲取產品ID值,進行數據庫操作。
優點:不使用服務器資源 ,廣泛支持,實現簡單
缺點:安全性不高,因為它被包含在頁面上進行發送,所以可以通過源文件看見他的內容。存儲結構少,僅僅支持string,integer,bool,array,arraylis t等簡單的數據結構。並且在其上只存放簡單的單值,若要存放多值,需要額外編碼。存儲量少,因為它被存儲在頁面本身,所以 無法存儲較大的值。而且大的數據量會受到防火牆和代理的阻止。注意: 使用了HiddenField之後,需要回發到服務器進行 處理,應該使用Http Post方法而不是Http Get方法(通過URL請求訪問)
3、Cookie:
利用場合為:存儲少量頁面中經常改動的信息,典型利用場合為:為登陸過的網站保存登陸用戶名,為用戶輸入提供方便 ,還有在一些用戶自定義項目上保存用戶的個性化設置。
優點:不使用服務器資源,實現簡單,可配置到期時間。
缺點:大小受到限制,一般浏覽器支持的最大的Cookie 容量為4096字節。客戶端用戶可能會配置為拒絕Cookie。安全性:保存在客戶端的信息可能會被惡意用戶修改或者獲取,所以不應該保存敏感信息。持久性:保存期限受到客戶端的配置影響。
Cookie 通常用於 存取已知用戶自定義內容的個性化情況。在大多數此類情況中,Cookie 是作為“標識”而不是“身份驗證”,所以在 Cookie 中只存 儲用戶名、賬戶名或唯一用戶 ID(例如 GUID)並使用它來訪問站點的用戶個性化結構是足夠的了。
4、QueryString:
利用場合為: 將信息從一頁傳遞給另一頁的最簡單的方法。
優點:不使用服務器資源,支持廣泛,實現簡單
缺點:安全性,因為直接在URL中暴露給用戶 ,所以有被篡改的風險。容量有限,一般的浏覽器都有255個字符的限制。只有在通過其 URL 請求頁時查詢字符串才是可行的選擇。不能從已提交給服務器的頁讀取 查詢字符串。
視圖狀態:需要為將回發到自身的頁存儲少量信息。ViewState 屬性的使用將提供具有基本安全性的功能。
隱藏域:需要為將回發到自身或另一頁的頁存儲少量信息,並且不需要較高的安全性。(客戶端事件)只能在提交到服務器的頁上使用隱藏域。
Cookie:需要在客戶端存儲少量信息並且不需要較高的安全性。(個性化)
查詢字符串: 可以將少量信息從一頁傳輸到另一頁,並且不需要較高的安全性。(頁面跳轉 )只有在請求同一頁,或通過鏈接請求另一頁時,才能使用查詢字符串。