使用Application记录当前登陆用户ID,当正常关闭IE时可以从中去掉用户ID
如果非正常关闭IE,怎么把用户ID去掉。 
Session_End里可以去掉ID,但是Session失效时间不能设置太短
正常关闭IE后,又可以再次登陆有没有方法解决
谢~~~~~~~~~~
第一次发贴,帮帮

解决方案 »

  1.   

    to Session_End里可以去掉ID,但是Session失效时间不能设置太短应该设置Session失效时间比较短,然后页面中嵌入js来定时向服务器发消息来进行重设session。
      

  2.   

    我这里的Session是存在数据里的,不会触发Session_end,是做的一个内部管理系统Session让它长时间保留!
    页面中嵌入js来定时向服务器发消息来进行重设session 这个怎么实现,能说详细点吗?
      

  3.   

    使用cookie
    登录时检查cookie,可以判断是否为正常退出,距上次登录多长时间,如果非正常退出后马上换台机器可能有问题,不过也可以通过较短的时间间隔来弥补。
    正常关闭清除cookie
      

  4.   

    给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。
      

  5.   

    使用cookie如果非法关闭浏览器,再不进行登陆,那该用户还没在在线用户中清除,到其它机子上就无法登陆了。
      

  6.   

    to 页面中嵌入js来定时向服务器发消息来进行重设session 这个怎么实现,能说详细点吗?js调用服务器的函数,参看
    http://community.csdn.net/Expert/topicview.asp?id=4850815至于定时你可以到asp.net板块搜一下
      

  7.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168
      

  8.   

    用javascript监控你的IE什么时候被非法关闭(指非点击按钮退出,如果采用杀进程什么之类的就没有用了)然后执行事件,看能不能达到你的要求script language="javascript">
    window.onbeforeunload = function()  
    {
      var n = window.event.screenX - window.screenLeft;
      var b = n > document.documentElement.scrollWidth-20;
      if(b && window.event.clientY < 0 || window.event.altKey)
      {
        window.event.returnValue = "";  //这里可以放置你想做的操作代码
      }
    }
    </script>
      

  9.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168这个方法不行,漏洞多多
      

  10.   

    用javascript监控你的IE什么时候被非法关闭(指非点击按钮退出,如果采用杀进程什么之类的就没有用了)然后执行事件,看能不能达到你的要求script language="javascript">
    window.onbeforeunload = function()  
    {
      var n = window.event.screenX - window.screenLeft;
      var b = n > document.documentElement.scrollWidth-20;
      if(b && window.event.clientY < 0 || window.event.altKey)
      {
        window.event.returnValue = "";  //这里可以放置你想做的操作代码
      }
    }
    </script>
    这个能够实现正常关闭IE
    主要是异常关闭IE不好搞
      

  11.   

    这个功能偶实现了。。
    控制一个用户只能同时登陆一个。
    用Session就可以实现。
    如果要代码我给我发邮件:
    [email protected]
      

  12.   

    你可以考虑在数据库中记录登陆用户的IP地址,如果是同一个iP的登陆,就返回给客户端消息!
      

  13.   

    用ajax在页面上自动每半分钟就发送一个is alive消息到一个WebService,这个WebService更新数据库里的登陆记录,刷新最后一次记录到alive消息的时间,这样子就不管Session的过期时间了,不管是主动关闭还是异常退出都可以检测到上一次的退出时间,半分钟的延时就可以再次登陆了。ajax我不是很熟这里就不放出代码献丑了,说说思路,大家看看合不可用,当然最显著的副作用就是频繁的交互对服务器的负担加重了
      

  14.   

    我也说说想法:
    1用户登录时往数据库写记录,包括用户名和打开本web系统页面数(登录时初始设为1)。
    2本页面被关闭或者调转时在onbeforeunload或者onunload中写javascript,用ajax技术后台写
    程序,将该用户打开本web系统页面数减一。为零时表示用户没有登录该系统的任何页面,即完全退出该web系统,这时用户可以再重新登录。
    3用户打开本系统新的页面,通过页面连接或者页面跳转,或者后台写window.open(),或者手工敲入页面地址等等,反正在响应时,即在页面page_load时,将用户打开本web系统页面数加一。实际上如果是本系统页面本页调转系统其它页面过程,就是一个打开页面数先见后加过程.
    4再回头看看第一点,用户登录时,就可以查询数据库用户打开本web系统页面数,为0表示未登录,则提示可以登录。
    当然如果系统IIS重起,这时应该清空数据库登录的数据,可以使用服务,检测IIS启动情况,如果未启动,则应去清空数据库登录的数据。
    其实不使用数据库,也可用Application来记录,不过要设置锁的形式,如果对于较小访问量的系统还可以,对负责的较大的系统就不行了。
      

  15.   

    我上面所说的情况,只需要在页面初始响应和页面onunload时去做操作,相比使用每一小段时间就去后台操作来说,要好很多,也同样也没有session的timeout限制。实际也一样需要ajax去操作。具体ajax使用方法,可以参照一下http://blog.joycode.com/kaneboy/archive/2004/07/07/26914.aspx(javascript调用后台代码)!
      

  16.   

    代码已经发到楼主的邮箱了。。
    再贴一个供大家参考吧!!Global.asax:  void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            Hashtable ht = new Hashtable();
            Application["onlineuser"] = ht;
            Application["onlinecount"] = 0;
        } 
      
     void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
            Application.Lock();
            Application["onlinecount"] = int.Parse(Application["onlinecount"].ToString()) + 1;
            Application.UnLock();
        } void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            try
            {
                Hashtable ht = (Hashtable)Application["onlineuser"];
                bool isAlive = false;
                foreach (string key in ht.Keys)
                {
                    if (key == (User.Identity.Name + "%%" + Request.UserHostAddress))
                    {
                        isAlive = true;
                        break;
                    }
                }
                if (!isAlive && Request.IsAuthenticated)
                {
                    FormsAuthentication.SignOut();
                    FormsAuthentication.RedirectToLoginPage();
                    return;
                }
                else if (isAlive && Request.IsAuthenticated)
                {
                    ht.Remove(User.Identity.Name + "%%" + Request.UserHostAddress);
                    ht.Add(User.Identity.Name + "%%" + Request.UserHostAddress, DateTime.Now.ToString());
                    Application["onlineuser"] = ht;
                }
            }
            catch (Exception ee)
            {
                //Response.Write(ee.Message);
            }
        }
        void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
            Application.Lock();
            Application["onlinecount"] = int.Parse(Application["onlinecount"].ToString()) - 1;
            Application.UnLock();
        }用户登录时验证:注意应该是先验证密码,然后再验证,是否登录,最后验证权限!bool logined = false;
    if (logined)
            {//验证是否允许重复登陆。
                Hashtable ht = (Hashtable)Application["onlineuser"];
                string tmpKey = "";
                foreach (string key in ht.Keys)
                {
                    if (key.Substring(0, key.LastIndexOf("%%")) == Login1.UserName)
                    {
                        if (key.Substring(key.LastIndexOf("%%") + 2) == Request.UserHostAddress) break;
                        else if (DateTime.Parse(ht[key].ToString()).AddMinutes(10) >= DateTime.Now)
                        {
                            Response.Write("<script>alert('你已在IP:" + key.Substring(key.LastIndexOf("%%") + 2) + " 上登陆,请在该机上点击注销以退出登陆。');</script>");
                            logined = false;
                            break;
                        }
                        else
                        {
                            tmpKey = key;
                        }
                    }
                 }
                if (tmpKey != "")
                {
                    ht.Remove(tmpKey);
                }
                try
                {
                    if(logined)ht.Add(Login1.UserName + "%%" + Request.UserHostAddress, DateTime.Now.ToString());
                }
                catch { }
                Application["onlineuser"] = ht;
            }
      

  17.   

    将userid sessionid ipaddress actionTime存到一个表里面,只有当用户的sessionid ipaddress和userid对应,才是在线的用户,否则就需要重新登录使用job对此表进行actionTime超过一定时间的用户进行清除
      

  18.   

    另外,一个userid在该表中最多只能有一条记录
      

  19.   

    thirdman(大肥猪) 
    --------------------------
    给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。
    -----------------------------------------------------------------------------------------------
    这个是最好的解决方法
      

  20.   

    你可以创建一个用户列表(HashTable)以键/值存放,登录验证有效并添加不用多说了。
    你加一个框架页面,在close的时候注销掉你的当前用户如:
    <script language="javascript" for="window" event="onunload">
    window.open("logout.aspx");
    </script>
    我这里是调用了logout.aspx去注销。
    你可以在框架页面中嵌入一个一直刷新的页面在此页面中进行验证和其它在线操作。
      

  21.   

    在线用户列表你可以用单例的方式来实现,或者保存在Application中,保证它在你的系统中只有一个实例来维持列表.
    你先要关心的用户怎么登录和退出的问题,举个例子,登录login.aspx,框架页面index.htm包含有top.aspx,leftframe.aspx,rightframe.aspx,online.aspx,登录验证后进行这个index.htm页面在这个框架页面中你想办法将index.htm关闭时执行注销操作,正如我上面写的javascript脚本
    <script language="javascript" for="window" event="onunload">
    window.open("logout.aspx");
    </script>
    调用的logout.aspx去注销,在用户列表中删除当前在线用户。
    online.aspx这个页面负责在线操作,如用户列表的刷新,它将每隔一段时间进行刷新页面。
    即便非法退出online也会去验证在线用户,如(你可以定义操作一定时间没有响应的用户,认为他已经退出)
    接下来如何实现在系统中同一帐号不重复登录
    你可以在用户列表存储一些信息,来和登录后保存在session中的一些信息是否匹配,来实现
    如:
    IP地址,在登录时,将用户登录的IP地址存放在session中,和用户在线列表中,将在列表中找有此用户则更新,无此用户添加到列表中
    online.aspx来实现踢出重复帐号,当前同一帐号,最后一个登录的用户一定更新了在线列表的信息,那么原来session中的ip和列表中用户信息的ip就会不同,如果不同就提示并退出.
      

  22.   

    谢谢大家的帮忙,最后有点忙,没上来看,想不到有这么多的朋友帮助,感激~~~
    问题解决了,可是项目经理说方法不太好,他说要改为cashe做,具体怎么实现还不太清楚,
    他还在研究!我是用thirdman(大肥猪)的这个方法做的 
    给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。结贴