引言
Web 頁面是無狀態的 服務器對每一次請求都認為來自不同用戶因此變量的狀態在連續對同一頁面的多次請求之間或在頁面跳轉時不會被保留在用AspNET 設計開發一個Web系統時 遇到一個重要的問題是如何保證數據在頁面間進行正確安全和高效地傳送 提供了狀態管理等多種技術來解決保存和傳遞數據問題以下來探討NET 下的解決此問題的各種方法和各自的適用場合
數據傳遞的各種方法和分析
使用Querystring 方法
QueryString 也叫查詢字符串 這種方法將要傳遞的數據附加在網頁地址(URL)後面進行傳遞如頁面Aaspx 跳轉到頁面Baspx可以用RequestRedirect(Baspx?參數名稱=參數值)方法也可以用超鏈接<a Baspx?參數名稱=參數值>頁面跳轉後在目標頁面中可用Ruquest[參數名稱]來接收參數使用QuerySting 方法的優點是實現簡單 不使用服務器資源缺點是傳遞的值會顯示在浏覽器的地址欄上有被篡改的風險不能傳遞對象只有在通過URL 請求頁時查詢字符串才是可行的
利用隱藏域
隱藏域不會顯示在用戶的浏覽器中 一般是在頁面中加入一個隱藏控件 與服務器進行交互時把值賦給隱藏控件並提交給下一頁面隱藏域可以是任何存儲在網頁中的與網頁有關的信息的存儲庫使用隱藏域存入數值時用hidden 控件value=數值取出接收數值時用變量=hidden 控件value使用隱藏域的優點是實現簡單 隱藏域是標准的HTML 控件不需要復雜的編程邏輯隱藏域在頁上存儲和讀取不需要任何服務器資源幾乎所有浏覽器和客戶端設備都支持具有隱藏域的窗體缺點是存儲結構少僅僅支持簡單的數據結構存儲量少因為它被存儲在頁面本身所以無法存儲較大的值而且大的數據量會受到防火牆和代理的阻止
ViewState
ViewState 是由ASPNET 頁面框架管理的一個隱藏的窗體字段當ASPNET 執行某個頁面時該頁面上的ViewState 值和所有控件將被收集並格式化成一個編碼字符串 然後被分配給隱藏窗體字段的值屬性使用ViewState 傳遞數據時可用ViewState [ 變量名]=數值在取出數據時用變量=ViewState[變量名]使用ViewState 的優點是在對同一頁的多個請求間自動保留值不用服務器端資源實現簡單視圖狀態中的值經過哈希計算和壓縮並且針對Unicode 實現進行編碼其安全性要高於使用隱藏域缺點是因為ViewState 存儲在頁面本身因此如果
存儲較大的值用戶顯示頁和發送頁時的速度可能會減慢雖然視圖狀態以哈希格式存儲數據但它仍可以被篡改
使用Cookie
Cookie 可以在頁面之間傳遞少量信息 可以存儲在客戶端的文本文件中也可存儲在客戶端的內存中Cookie 方法適用於存儲少量頁面中經常改動的信息 如為登陸過的網站保存登陸用戶名為用戶輸入提供方便還有在一些用戶自定義項目上保存用戶的個性化設置使用Cookie傳遞數據時可用ResponseCookies[鍵名]=鍵值取出數據用變量名=RequestCookies[鍵名]使用Cookie 優點是Cookie 存儲在客戶端 不使用服務器資源實現簡單可配置到期時間缺點是可以存儲的數據量比較少由於Cookie 並不被所有的浏覽器支持而且還可能被用戶禁止或刪除所以不能用於保存關鍵數據另外Cookie 保存的形式是簡單的明文文本在它裡面不宜保存敏感的未加密的數據
使用Application 變量
使用Application 變量也可以實現頁面間的傳值Application變量是全局性的所有用戶共享一個Application 變量一旦定義它將影響到程序的所有部分如果想在整個應用程序范圍使用某個變量值Application 對象將是最佳的選擇存入數據時 把值添加到Application 變量裡Application[變量名]=數值取出數據用變量=Application[變量名]在不需要使用該Application 時要顯式清除它Application[量名]=null
Application 優點易於使用全局范圍可供應用程序中的所有頁來訪問缺點若保存數據的服務器端進程被損壞(如因服務器崩潰升級或關閉而損壞)那麼數據就會丟失所以利用Application 一定要有保底的策略占用服務器端的內存這可能會影響服務器的性能以及應用程序的可伸縮性
使用Session 變量
Session 對象可以用來存儲需要維護的指定對話的信息不同的客戶端生成不同的Session 對象Session 用於存儲特定於單獨會話的短期信息Session 的使用方法和格式與Application 相同
優點易於實現並且提供較高的安全性和持久性可以應對IIS 重啟和輔助進程重啟可在多進程中使用缺點是耗用服務器端的內存所以不要存儲大量的信息Session 最常見的用途是與Cookie 一起向Web 應用程序提供用戶標識功能Session也可用於不支持Cookie 的浏覽器但是使用無Cookie 的Session 需要將會話標識符放置在查詢字符串中同樣會遇到本文在查詢字符串一節中陳述的安全問題
使用類的靜態屬性
這種方法是利用類的靜態屬性實現兩個頁面間的值傳定義一個包含靜態屬性的類將要傳送的值賦給靜態屬性目標頁面中可以通過靜態屬性獲得源頁面中要傳的值
優點是可以方便傳送多個數據缺點是需要額外編程增加
程序設計的工作量占用服務器內存
使用ServerTransfer
通過ServerTransfer 方法把執行流程從當前的ASPX 文件轉到同一服務器上的另一個ASPX 頁面的同時可保留表單數據或查詢字符串做法是把該方法的第二個參數設置成True在第一個頁面用ServerTransfer(目標頁面名aspxtrue)目標頁面取出數據用RuquestForm[控件名稱]或RuquestQueryString[控件名稱] 中還可以這樣來用代碼如下
PreviousPage pg pg=(PreviousPage)ContextHandler ResponseWrite(pgName)
說明 此段代碼用在目標頁面中取出傳遞的值Previous Page 是原頁面的類名Name 是在原頁面定義的屬性 需要傳遞 的數據存入到此屬性中
使用這種方法 需要寫一些代碼以創建一些屬性以便可以 在另一個頁面訪問它 可以在另一個頁面以對象屬性的方式來 存取數值這個方法在頁面間值傳遞中是特別有用的這種方法 不但簡潔同時又是面向對象的
Cache
Cache 具有強大的數據操作功能 以鍵值對集合的形式存 儲數據可以通過指定關鍵字來插入和檢索數據項它的基於依 賴性的終止功能 使它能夠精確控制如何並及時更新和消除緩 存中的數據它可以內部進行鎖定管理不需要象Application 對象那樣使用Lock()和Unlock()方法進行串行化管理缺點是使用 方法較復雜使用不當反而降低性能
不同頁面跳轉情況下可采用的傳值方法
情況一源頁面可以跳轉到目標頁面源頁面傳遞數據給目標頁面
使用查詢字符串 將少量信息從一頁傳輸到另一頁以及不 存在安全性問題時是一個簡單常用的方法使用ServerTransfer方法可傳遞表單數據或查詢字符串到另一個頁面還可以 保存初始頁的HttpContext 當目標頁和源頁面在同一個服務器 時可以用此方法
情況二頁面傳遞數值給自身頁面
即在對同一頁的多個請求間保留值 ViewState 屬性可提供具有基本安全性的功能也可用隱藏域存儲少量回發到自身或另一頁的頁信息時使用不考慮安全性問題時使用
情況三源頁面傳遞數值給目標頁面而源頁面不能直接連接到目標頁面
有多個方法具體用哪個要看具體情況
Application 存儲由多個用戶使用且更改不頻繁的全局信息此時安全性不成為問題不要存儲大量的信息Session存儲特定於單獨會話的短期信息並且需要較高的安全性不要在會話狀態中存儲大量的信息需要注意將為應用程序中每一會話的生存期創建並維護會話狀態對象在支持許多用戶的應用程序中 這可能會占用大量服務器資源並影響可縮放性
Cookie 當您需要在客戶端存儲少量信息以及不存在安全性問題時使用類的靜態屬性方便傳送多個數據
Cache 對象用於單個用戶一組用戶或所有的用戶可以為多個請求長時間高效率的保存數據上述幾個方法 不僅用於情況三 前面兩種情況都可以使用只是沒有必要時盡量少用否則會造成資源浪費或增加程序的復雜性
From:http://tw.wingwit.com/Article/program/net/201311/13186.html