謹慎使用asp.net中的static變量


   用慣了C/S編程,經常定義全局變量的時候,為了方便,而且下次調用某函數的時候仍能獲取到變量的值,我們經常會定義static類型的全局變量。
 
  但是現在轉而B/S的編程,壞習慣自然而來的的沿用過來。每張頁面登錄的時候,用戶的基本信息全局變量全部都定義成了static類型。結果,發現了一個嚴重的問題。就是用戶張三登錄了,顯示的是張三的基本信息,然后張三用戶添加了一條記錄。照例說列表中顯示的是張三添加完的記錄,結果列出來的是李四的信息。這是神馬情況。
 
  其原因就是static變量搞的鬼了,因為張三用戶登錄后,李四馬上登錄了,此時服務器上static變量的值被重新賦值,而不是張三的名字了,別李四給替換了。這樣,張三添加信息后,數據庫在給張三列表顯示其數據的時候。李四的信息就自然而來的顯示出來了。這看似很詭異的問題,其實暗含着asp.net的運行機制問題。
 
  asp.net中,所有用戶使用的是同一個static變量的值,這個常適用與記錄站點的訪問歷史人數。每次多一個人訪問,static變量的值就加一。所有的用戶顯示的站點歷史人數值也跟着變化。但是其萬萬不能被使用於記錄用戶登入的全局變量,不然就會出現上述的問題。小小全局變量暗含着潛在的數據泄露的大殺機。
 
  那么要是想實現B/S端針對客戶端用戶的頁面級的全局變量該怎么實現呢? 還好,除了傳統的Asp中的Session對象外,Asp.net提供了一個更好的ViewState對象。ViewState對象用來保存頁面中的各種變量,甚至是對象。為什么可以用ViewState而不能用static變量哪?原因就是服務器端會為每個連接到該頁面的用戶分別建立一個ViewState,所以ViewState相當於頁面級的Session。這下我們可以放心地使用ViewState來存取需要暫存的變量和對象了。不過如果要使用 ViewState,則在 ASPX 頁面中必須有一個服務器端窗體標記 (<form runat=server>)。
 
  小弟今年大四,前不久給學院開發了個小系統,發布后才發現這個詭異的不同用戶登錄數據亂串的問題。后來網上找了資料才發現是全局變量的問題導致的。哎....還好這個系統沒用機密數據,不然就悲劇了。現在急着要將static變量修改。除了網上的這個ViewState對象的方法。大家之前有碰到過這個問題,然后用什么更好的方法實現了的么?或者有哪位大神能深入的和我講解下asp.net的幾個全局變量(Session,Cookies,Application,Cache等)的運行機制。再次感謝感謝再感謝了啊。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM