情景描述:在B/S结构的系统中很多人喜欢使用Session记录用户登录信息,页面关闭后Session自然也就消失了。使用起来确实方便省事。然而在浏览器中存在一个现象,使用Ctrl+N打开一个新页面时,这时Session发生共享,也就是说在新开的窗口中仍然可以获得旧窗口中使用的Session。难道这不对吗?有问题吗?
问题来了:若某个具有特殊页面权限的用户在录入完他的报表时,(注意:还未点“保存”哩)此时使用Ctrl+N打开一个新窗口,并用另外一个权限级别较低却只能查看该报表页面的身份登录进系统。此时原先的窗口对应的Session已经发生了变化,Session中记录的已经是新的用户了。现在我们回到最初的那个报表窗口,点击“保存”,显示操作成功。一切都ok了,没抛出异常啊,是这样的吗?
原来如此:我们再看一下数据库,刚才录入的报表中UserID是什么,对了,是一个并没有报表录入权限的用户ID。这么会这样哩?当然是Session共享的原因了。如何解决呢?
方法一:在每次点击保存动作时都判断一下该用户是否有权限。(那要改多少地方啊!!!)
方法二:只让我们的系统中出现一个IE的窗口。(似乎太霸道了点.....似乎也不怎么好实现。)
方法三:禁用Ctrl+N不就好了,这个方法不错,用几行javascript就可以搞定。(不过IE菜单上有个文件->新建->窗口一样可以打开新窗口)
难道真没方法了吗?
我们发现问题发生在不该改写Session时写了新的Session值,在用户登录时,一旦ValidateUser成功,写Session就发生了,所以我们可以在ValidateUser之前做点手脚了。在ValidateUser之前,我们看看Session之是否记录了登录用户,如果记录了,就判断一下是新登录的用户,若不是则抛出提示。