您的位置:首页 > 编程语言 > ASP

asp.net关闭浏览器后强制用户离线

2013-11-08 21:46 531 查看
asp.net用户登录后,状态更新为在线,在点击程序中退出按钮后自动离线,并记录到日志表中。但是如果强制关闭浏览器,就无法记录。

后来想通过心跳包的方式,在正常登录并在线时每隔一分钟刷新一次登录状态,后台数据库定时2分钟执行一次检测是否异常退出的存储过程,如果最后一次心跳包时间与当前系统时间相比超过3分钟,则强制用户离线。

此方式个人在winform c/s程序中经常使用。

实现核心代码:

在登录后的主页面中定时执行下面的js:

window.setInterval("RefLogin()", 60000);//登陆后定时注册在线信息
function RefLogin() {
$.ajax({
//要用post方式
type: "Post",
//方法所在页面和方法名
url: "Default.aspx/LogIn",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function () {

},
error: function (err) {
alert(err);
}
});
}


主页面Default.aspx/LogIn方法:

[WebMethod]
public static void LogIn()
{
LogOperation.RefreshLoginStatus();
}


LogOperation.RefreshLoginStatus()

/// <summary>
/// 刷新用户登陆状态
/// </summary>
public static void RefreshLoginStatus()
{
string strID=System.Web.HttpContext.Current.Session["USERID"].ToString();
string strsql = "update t_sysuser set Status='1',RefreshTime=GETDATE() where id='" + strID + "'";
DbHelper.CurrInstance.ExecuteNonQuery(strsql);
}


sqlserver定时循环执行存储过程:

ALTER PROCEDURE [dbo].[RefreshLogin]

AS
BEGIN

declare @Id varchar(36)
declare @RealName Nvarchar(10)

DECLARE curDel CURSOR FOR SELECT ID,Realname FROM t_sysuser where Status='1' and dateadd(minute,-3,GETDATE())>RefreshTime
open curDel
fetch next from curDel into @Id,@RealName
while @@FETCH_STATUS = 0
begin
insert into t_log(ID,UserID,RealName,LogTime,Categories,BusinessID,LogContent)
values(newid(),@Id,@RealName,GETDATE(),'退出','','强制退出');
update t_sysuser set Status='0' where ID=@Id;
fetch next from curDel into @Id,@RealName
end
close curDel
DEALLOCATE curDel
END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: