asp.net多用户登录数据乱串
用惯了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>)。