现在我想要做的是,我又一个登出的按钮,我点击登出,从session 中取出我登录时,在session 中保存的用户,之后改变数据库中,改用户的状态时登出状态, 如果用户并没有直接点登出而是直接关闭浏览器,我怎么样才能改变数据库中该用户的状态。

解决方案 »

  1.   

    你要解决的问题我之前遇到过,是想解决单账号不能同时在线多个吧
    由于不同的浏览器对session的支持不一样,所以很难做到客户退出的服务器端监测
    例如你举出的用户直接关闭浏览器,这时候属于浏览器非法关闭行为,即使使用脚本也无法实现这种非正常关闭的监测
    所以目前对禁止单账号同时多用户登录的问题有两种解决方法
    一、定时对无操作的用户清空登录状态
    二、如果账号被二次登录,顶出上次登录的账号,这样也只能实现单账号单用户使用
      

  2.   

    我想你的意思是不是比如说:我刚注册个账号:aaa,登录过后进入页面,在数据库中aaa是已登录,而你有个登出按钮,点击的时候把aaa登录状态该成已登出,但是用户是直接关闭浏览器的,所以你不能判断,数据库中还是已登录是吧
      

  3.   

    点关闭窗口的时候,可以触发事件(js事件)onbeforeunload,用js ajax异步去调用登出的相关操作;此方法无法捕获突然停电等特殊因素。
    在用户登录的时候可以考虑使用application来存储每个登录用户的session,用ajax心跳检测某用户是否已经登出。考虑的不甚周全,期待高手解答!
      

  4.   

    //单人登入,即时登出
    //首先设置web.config文件;
    <sessionState mode="StateServer" cookieless="false" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" timeout="1"/>      //然后在登入事件中加入;      ///同一时间点,检查登录用户ID的唯一性///</summary>    ///<param name="strZh">用户ID </param>    ///<returns></returns>    private bool ckeckUserOnlyOne(string strZh)    {         string strTempZh=strZh;        if (Cache[strZh] == null)        {            TimeSpan SessTimeout = new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0);            HttpContext.Current.Cache.Insert(strTempZh,strTempZh,null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);            return true;        }        else            return false;}//复制代码
    //然后在登出事件加入;
      try        {            Session.Abandon();            System.Web.HttpContext.Current.Session.RemoveAll();            Cache.Remove("用户ID");        }        catch (Exception ex)        { }//复制代码
    //主角登场了,在每个页面引入下面的JS;
    <script>var step=0;    function myRefresh()    {        var httpRequest = new ActiveXObject("microsoft.xmlhttp");        httpRequest.open("GET", "delSession.aspx", false);        httpRequest.send(null);        step ++;        if(step <2)//注意2        {            setTimeout("myRefresh()",30*1000); //30秒        }    }    myRefresh();</script>
    //项目的Root目录下new一个delSession.aspx文件,然后在她的page_laod方法中写上Response.Expires = -1; 
       
      

  5.   

    通过Global.asax文件中的Session_End事件监测,不过要等到会话超时才会触发估计(我也没弄过)也可以定时向服务器发送信息(包含用户名和时间),表示客户仍在使用
    然后服务器定时清理最近没有收到消息的用户
      

  6.   

    Session.RemoveAll();
    Session.Abandon();
    FormsAuthentication.SignOut();
     修改数据库中登录状态
    ajax轮询查询用户状态
      

  7.   

    onbeforeunload方法我使用过,这种方法的弊端是:无法捕捉非法关机事件,例如在你未关闭浏览器时,你电脑死机了,你直接按下了电源键;停电了;你用任务管理器关闭了浏览器等等;所以在使用这种服务器监测客户端关闭事件时,不要对登录单独设置一个数据库字段
      

  8.   

         应该是单点登录里面的登出功能!!!
        我最近也在做,只是用的是基于SAML协议的SSO,里面涉及到证书什么的,也纠结的很!!!