多标签IESession覆盖的解决方案

来源:互联网 发布:日语等级考试分数算法 编辑:程序博客网 时间:2024/05/16 12:36

在IE6中,每启动1个IE,在进程中就会增加1个iexplor.exe进程,一个此进程就表示1个session对象,就会产生1个唯一sessionID与之对应。

但是在多页签的浏览器例如IE7,IE8 ,没启动一个IE,此时浏览器中会有俩个iexplor.exe进程存在,1个代表当前窗口对象,另1个代表页签对象,如果在窗口中新增加页签的话,iexplor.exe的数量会加1.

在多页签的浏览器中,进行测试,页面的page_load事件中,增加代码测试:

string a = Session.SessionID;
Response.Write(a + "<br>");

发现在1个窗口中,无论打开多少个页签,都是同1个sessionID,那么问题就出现了,比如说:我在一个多标签的浏览器中,打开了俩个页签,分别叫A页签与B页签,那么我此时在A页签中打开1个登陆界面,输入A账户的用户名与密码,并且用session保存这个A用户的账号与密码,然后在B页签里面输入B的账户与密码,并且用session保存起来,那么此时你回头再刷新下A的页签,你会发现A页签里的session保存的A的信息全部被B的信息所覆盖了,这就是多页签使用同1sessionID的产生覆盖的核心机制。那么我们该如何处理呢?

我的解决方案是:1个IE窗口只能做1个登陆操作,如果你想再登陆,那么重新打开1个IE对象。

protected void Button1_Click(object sender, EventArgs e)
        {
            if (Session["a"] != null)
            {
                PublicMethods.ShowMessageBox(this, "同一浏览器不能重复登录!");
                return;
            }
            Session["a"] = this.txtName.Text.Trim();
            Response.Redirect("Test.aspx");
        }

原理说明:1个多页签IE窗口无论打开多少个页签都是一个sessionID,那么这个sessionID对象下有1个key为a的session内容,如果你第一次登陆的话,这个session为a的内容为Null状态,如果你打开1个页签再做1个登陆操作的话,那么此时session a 就不为Null,提示用户新开1个窗口进行操作。因为新打开的IE会产生1个新的不重复的sessionID,此时这个sessionID对象对应的session a 还是为Null,那么可以进行登陆操作了。

 

原创粉丝点击