asp 在线人数统计
对于做B/S开发的人来说,统计在线的人数是个很重要的工作,一般的统计方法是利用Application保存在线人数。我今天要讲的也是用这个方法,但是,在这个方法上增加一点内容,就是,当用户直接关闭IE后,也要立刻将在线人数减少,而一般的方法是要等待Session过期后才能统计。好了,开始了。
1、首先,配置fig
将Session的状态配置成如下,为什么我就不说了。
1、首先,配置fig
将Session的状态配置成如下,为什么我就不说了。
<sessionState mode="InProc"></sessionState>
2、Global.asax的各个方法
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Application.Add("OAS_Line_Counts", 0);
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
Application.RemoveAll();
}
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Application.Add("OAS_Line_Counts", 0);
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
Application.RemoveAll();
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
Session.Timeout = 30;
}
void Session_End(object sender, EventArgs e)
在线代码运行器{
// 在会话结束时运行的代码。
// 注意: 只有在&fig 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Application.Lock();
if (Application["OAS_Line_Counts"] != null)
{
Application["OAS_Line_Counts"] = Int32.Parse(Application["OAS_Line_Counts"].ToString()) - 1;
if (Int32.Parse(Application["OAS_Line_Counts"].ToString()) < 0)
Application["OAS_Line_Counts"] = 0;
}
Application.UnLock();
// 注意: 只有在&fig 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Application.Lock();
if (Application["OAS_Line_Counts"] != null)
{
Application["OAS_Line_Counts"] = Int32.Parse(Application["OAS_Line_Counts"].ToString()) - 1;
if (Int32.Parse(Application["OAS_Line_Counts"].ToString()) < 0)
Application["OAS_Line_Counts"] = 0;
}
Application.UnLock();
}
</script>
</script>
3、登陆成功后的人数加一
Application.Lock();
if (Application["OAS_Line_Counts"] != null)
{
Application["OAS_Line_Counts"] = Int32.Parse(Application["OAS_Line_Counts"].ToString()) + 1;
}
else
{
Application["OAS_Line_Counts"] = 1;
}
Application.UnLock();
if (Application["OAS_Line_Counts"] != null)
{
Application["OAS_Line_Counts"] = Int32.Parse(Application["OAS_Line_Counts"].ToString()) + 1;
}
else
{
Application["OAS_Line_Counts"] = 1;
}
Application.UnLock();
4、退出时减一
Session.RemoveAll();
Session.Abandon();//取消会话状态就会触发Session_End的事件
Session.Abandon();//取消会话状态就会触发Session_End的事件
5、当关闭窗口时的统计(关键的地方)
如果页面是用框架结构做的,则里面不能用的控件,而且没有body,因此,我们只能调用其他的页面来实现。
我的方法如下:
如果页面是用框架结构做的,则里面不能用的控件,而且没有body,因此,我们只能调用其他的页面来实现。
我的方法如下:
<script language="javascript" type="text/javascript">
function PageClose()
{
//这样写,主要是防止刷新也触发该事件
if(event.clientX>document.body.clientWidth-30 && event.clientY<0 || event.altKey) //event.altKey表示按下了Alt按纽
{
//alert("X:"+event.clientX+" Y:"+event.clientY+" "+document.body.clientWidth);
window.location .href="PageCloseCount.aspx";
widnow.close();
}
}
</script>
</head>
function PageClose()
{
//这样写,主要是防止刷新也触发该事件
if(event.clientX>document.body.clientWidth-30 && event.clientY<0 || event.altKey) //event.altKey表示按下了Alt按纽
{
//alert("X:"+event.clientX+" Y:"+event.clientY+" "+document.body.clientWidth);
window.location .href="PageCloseCount.aspx";
widnow.close();
}
}
</script>
</head>
<frameset onbeforeunload="PageClose()" rows="88,*" cols="*" framespacing="0" frameborder="no" border="0" bordercolor="#0099FF">
<frame src="top.aspx" name="topFrame" scrolling="NO" noresize>
<frameset rows="*" cols="148,*" framespacing="0" frameborder="no" border="0" bordercolor="#33CCFF">
<frame src="left.aspx" name="leftFrame" scrolling="yes" noresize>
<frame src="desktop.aspx" name="mainFrame" scrolling="yes">
</frameset>
</frameset>
<noframes><body>
</body></noframes>
<frame src="top.aspx" name="topFrame" scrolling="NO" noresize>
<frameset rows="*" cols="148,*" framespacing="0" frameborder="no" border="0" bordercolor="#33CCFF">
<frame src="left.aspx" name="leftFrame" scrolling="yes" noresize>
<frame src="desktop.aspx" name="mainFrame" scrolling="yes">
</frameset>
</frameset>
<noframes><body>
</body></noframes>
PageCloseCount里调用的方法
public void PageClose()
{
System.Web.HttpContext.Current.Session.RemoveAll();
System.Web.HttpContext.Current.Session.Abandon();
}
{
System.Web.HttpContext.Current.Session.RemoveAll();
System.Web.HttpContext.Current.Session.Abandon();
}
如果不是用框架做的就要简单些了,可以不需要调用其他的页面来执行方法,用他自己就可以了。
部分代码:
<script language="javascript" type="text/javascript">
function PageClose()
{
if(event.clientX>document.body.clientWidth -30 && event.clientY<0 || event.altKey) //event.altKey表示按下了Alt按纽
{
document.all('ButtonPageClose').click();
document.all('ButtonPageClose').focus();
}
}
</script>
</head>
<body onbeforeunload="PageClose()">
function PageClose()
{
if(event.clientX>document.body.clientWidth -30 && event.clientY<0 || event.altKey) //event.altKey表示按下了Alt按纽
{
document.all('ButtonPageClose').click();
document.all('ButtonPageClose').focus();
}
}
</script>
</head>
<body onbeforeunload="PageClose()">
按纽里的方法同上面一样,也是取消会话。
这个方法我测试了,好象基本上可以,但是又好象有时没调用到,好象是和用户点击按纽的位置有关。
统计在线用户列表 asp
来源:wwwblogs/mrcooldog/archive/2007/10/24/936211.html
以下有改动:
.NET对用户的状态控制采用SESSION(COOKIE也可以,但是无法在服务器端触发SESSIONEND事件,所以这里说到的方法是基于使用SESSION的)
.NET 和 ASP中都可以使用Global.asax来对SESSION END事件进行程序设置,网上有很多关于使用global.asax结合APPLICATION和SESSION END事件写的统计在线人数的方法,但是我没到统计详细的在线用户信息的资料。
因此,我自己用了一个方案来实现,并调试成功。
思路:通过Session_End事件判断哪个(些)用户过期,或则通过用户点击退出删除该用户在列表的信息,然后清除会话。
首先,需要一个可公用的服务器端的存储对象,例如 SQL,文本,XML文件或则APPLICATION ,为了调试方便我使用的是APPLICATION,在这个存储对象中需要存储一个可所以的字典的对象,例如数组等,这里我使用的是Hashtable,好处是Hashtable可以通过一个KEY键来索引,可以通过KEY来删除、添加等操作,而且这个KEY不仅仅是数字索引,可以是你设置的任何对象,对用户会话是否过期判断最好就用用户最后的活动时间做索引。
我在这个Hashtable中设置KEY为用户最后时间,Value设置为用户登陆名,方便显示和超时比对。(登录名做Value值的好处是同一个empid可以重复登录)
我在这个Hashtable中设置KEY为用户最后时间,Value设置为用户登陆名,方便显示和超时比对。(登录名做Value值的好处是同一个empid可以重复登录)
在Global.asax中的Session_End事件中不支持任何的Request 对象和Response对象,所以不能从客户端读取任何信息,这也是为什么不用COOKIE的原因。
虽然,调用Session.Abandon()方法也会触发Session_End但是用户的Session全部销毁后
才会除法Session_End,所以这时候并不能确定是那个用户触发的Session_End。因此,需要把用户的动作分为两类:
1:点击退出调用Session.Abandon() ;
2:过期超时;
这样,这个程序就分成了两个部分
1:点击退出调用Session.Abandon() ;
2:过期超时;
这样,这个程序就分成了两个部分
1、点击退出:先将APPLICATION中的当前会话的用户的列表信息删除,然后再清除会话。
2、过期超时:这时会触发Session_End事件,在该事件中,比对所有列表内用户信息,判断最后活动时间与当前时间,超时的就删除。
2、过期超时:这时会触发Session_End事件,在该事件中,比对所有列表内用户信息,判断最后活动时间与当前时间,超时的就删除。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论