谨慎使用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等)的运行机制。再次感谢感谢再感谢了啊。
 
posted @ 2012-12-06 14:44  然嗄  阅读(13190)  评论(25编辑  收藏  举报