最近工作过程中,同事一个项目里面,发现一个问题,某B/S Web系统里面,A用户登录发布信息,同时B用户也登录发布信息,这时候对A用户而言,在页面上应显示A用户的内容和A用户的签名,对B用户也是如此,两者信息不会混淆。但实际上A用户处却显示A用户和B用户的签名。类似混淆的情况在我参与的另一个系统项目中也出现过,同时多个用户登录访问,填写信息,相互之间的信息混淆得比较严重。
项目源码中,用户ID是唯一的,用Session传递,不同登录用户的Session不会相同,不应出现混淆的情况,同时发现,我们大量地使用static变量。原意是想用作全局变量。使不同用户的信息不会混淆。但看来实际效果与设想的相反。
我当时手上还在忙另一个项目,也未想出合理解决方法。同事通过分析,初步解决了这个问题,为了避免自己忘记,整理了一下一些想法,也算为自己提个醒。
主要是static变量的作用范围需要明晰
在一个类中定义了一个static变量,只在同一个执行上下文中,所有用户访问到的都是同一个变量。也就是说在一个类中定义了一个static变量 所有用户访问到的都是同一个变量,static的作用范围显然是应用程序级,而不是会话级(页面级)。从这个角度分析,定义了static UserID变量,A用户登录系统,对UserID赋值A,UserID=A,在A没有发布信息之前,UserID的值维持A不变,此时B用户登录,同样的,对UserID赋值B,因为static作用范围是应用程序级,所有用户共享这个static变量,故此时UserID变量的值不再是A而是B。接着,A用户提交发布信息,A的UserID是B,所以最终显示的用户签名就不再是A而是B了,就产生了混淆。
这一点分析清楚了,在页面级,就禁止使用static变量,改用普通变量进行操作。配合使用ViewState,问题就得到解决;
博客园 Meyer的Blogs也提到的这个问题,他的文章也给我不少启示。
记下这个问题,提醒自己一下。
项目源码中,用户ID是唯一的,用Session传递,不同登录用户的Session不会相同,不应出现混淆的情况,同时发现,我们大量地使用static变量。原意是想用作全局变量。使不同用户的信息不会混淆。但看来实际效果与设想的相反。
我当时手上还在忙另一个项目,也未想出合理解决方法。同事通过分析,初步解决了这个问题,为了避免自己忘记,整理了一下一些想法,也算为自己提个醒。
主要是static变量的作用范围需要明晰
在一个类中定义了一个static变量,只在同一个执行上下文中,所有用户访问到的都是同一个变量。也就是说在一个类中定义了一个static变量 所有用户访问到的都是同一个变量,static的作用范围显然是应用程序级,而不是会话级(页面级)。从这个角度分析,定义了static UserID变量,A用户登录系统,对UserID赋值A,UserID=A,在A没有发布信息之前,UserID的值维持A不变,此时B用户登录,同样的,对UserID赋值B,因为static作用范围是应用程序级,所有用户共享这个static变量,故此时UserID变量的值不再是A而是B。接着,A用户提交发布信息,A的UserID是B,所以最终显示的用户签名就不再是A而是B了,就产生了混淆。
这一点分析清楚了,在页面级,就禁止使用static变量,改用普通变量进行操作。配合使用ViewState,问题就得到解决;
博客园 Meyer的Blogs也提到的这个问题,他的文章也给我不少启示。
记下这个问题,提醒自己一下。