判断用户什么时候离开,以什么方式离开

站点用户统计是每一个站点比有得功能,但是很少有人实现在线用户统计得绝对精确或者说是相对精确,基于Web得原理,服务器不会主动知道用户通过关闭浏览器离开站点,这时候只能依靠服务器端变量Session得过期来判断用户是否离开,但用户浏览器是可以知道自己何时关闭得,代码也非常简单

如下:

function body_onunload()

{

   if(window.event.clientX<0)

   {

          alert('the broswer is closing...');

   }

    else

    {

         alert('the user is refreshing or navigating away...);

    }
}

以上代码就会判断用户是关闭浏览器还是刷新或者导航到其他页面了!


---------------------------------------------------------------------------------------------------
下午的时候,用代码测试了一下,主要是利用上面的js函数,结合ajax技术,由于对ajax技术了解的不是很透彻,前后尝试了三次。
现将尝试结果与大家分享,大家也多给点意见
首先我尝试了在ajax方法中访问Application,企图用Application变量来记录在线人数。尝试代码:
[AjaxPro.AjaxMethod]
  public int Logoff()
  {   
       Application["onlineCount"]=Convert.ToInt32(Application["onlineCount"])-1;
      return      Convert.ToInt32(Application["onlineCount"]);
  }
尝试失败!估计是ajax不能访问应用程序的静态变量和Application变量。第一次使用AjaxPro不知道如何设置可以访问Session,以前使用的是ajax.dll,设置成可以读写Session,尝试结果可能发生改变!
第二种我尝试了用文本文件记录在线人数,仍然失败!
第三中,采用数据库!尝试成功。
代码如下:
[AjaxPro.AjaxMethod]
  public int Logoff()
  {   
   SqlConnection conn = new  SqlConnection("server=.;database=test; uid=sa;pwd=123");
   SqlCommand cmd = new SqlCommand("update OnlineCount set num=num-1",conn);
   try
   {
    conn.Open();
    cmd.ExecuteNonQuery();
   }
   catch(Exception ex)
   {
    EventLog.WriteEntry(ex.Source,ex.Message);
   }
   finally
   {
    conn.Close();
   }
   
   cmd = new SqlCommand("select top 1 num from OnlineCount",conn);
   try
   {
    conn.Open();
    return Convert.ToInt32(cmd.ExecuteScalar());
   }
   catch(Exception ex)
   {
    EventLog.WriteEntry(ex.Source,ex.Message);
   }
   finally
   {
    conn.Close();
   }
   return 0;
   
  }
前台页面缩

 1    <script language="javascript">
 2<!--
 3       function leave() 
 4       
 5          alert(window.event.clientX);
 6          if(window.event.clientX<0)
 7          {
 8            WebApplication3.WebForm1.Logoff().value;
 9          }

10       }

11//-->
12        
</script>
13    </HEAD>
14    <body onunload="leave()">

这样的话,在对安全行和及时性要求比较严格的情矿下,将一个页面设置为主页面,如果该页面关闭,表示用户已经退出。电子邮件系统就可以使用该方法。
     

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-04-12 19:21 Robin Zhang 阅读(1806) 评论(11)  编辑 收藏 网摘 所属分类: asp.net

  回复  引用  查看    
#1楼[楼主]2006-04-13 12:33 | jillzhang      
那么结合现在比较流行的xmlhttp或者ajax技术,在脚本判断客户短事件发生的时候,触发以下服务器端得注销代码,不知道是否能实现用户关闭浏览器就注销的功能 ,晚上做个demo,测试一下。现在只是思考了一下,原理上,感觉可以 !
  回复  引用  查看    
#2楼[楼主]2006-04-13 19:01 | jillzhang      
呵呵,测试结果为数据库记录用户在线的情形下,可以这么干!
  回复  引用    
#3楼2006-04-13 22:40 | aysun168[未注册用户]
我想问一下,用户关闭了浏览器,但是是不小心关闭的,难到再一次打开页面,要重新登陆吗?又一次服务器的交互?
再一次的计算在线人数?这对服务器是不是一种负担?

  回复  引用    
#4楼2006-04-14 08:33 | 默石[未注册用户]
完全可以,我测试通过
  回复  引用  查看    
#5楼2006-04-14 08:45 | 可乐加冰      
@aysun168
这样的一两次交互算不了什么,安全重要

  回复  引用  查看    
#6楼[楼主]2006-04-14 09:01 | jillzhang      
就像楼上的朋友所说,这样的功能只是应用于特定的环境下面,使用起来还有很大的局限性 ,如何更改局限性,还需要大家帮忙。
上面的方法只是应用于有一个主页,类似于框架的那种,所有操作都在一个页面来进行,这个方法完成的功能就是捕捉客户端关闭浏览器的事件,再由客户端主动通知服务器端自己的状态,这样比现有的Session过期的方法要精确点

  回复  引用  查看    
#7楼2006-07-25 13:38 | 仰天一笑      
很好的方法,up,现在正需要
  回复  引用    
#8楼2007-01-21 16:27 | net[未注册用户]
刷新也执行了....
  回复  引用    
#9楼2008-09-27 00:44 | duyongbing[未注册用户]
弄了半天也没有弄好,能给个demo吗?duyongbing@126.com,谢谢!
  回复  引用    
#10楼2008-09-27 17:16 | duyongbing[未注册用户]
关闭浏览器的时候如何捕获触发事件并改变数据库中的状态?



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 373566




相关文章:

相关链接: