假使有用户A使用 该页面5秒后,第六秒时用户B登录,能够知道当前有用户A在线
而如果A在第5秒时,按了“关闭”按钮,退出了改页面,假设系统超时为10分钟
那么(delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10)是不起做用的,所以数据库里仍认为用户A在线,而其实A已经退出系统了。请问myexam(exam) 以及其它高人,这个问题怎么解决?
--删除超时的记录
delete from Accounts_Online where Datediff(minute,ActiveTime,getdate())>10
Select @Count = Count(UserGuid) from Accounts_Online where UserGuid=@UserGuid
IF @Count = 0
begin
Insert Into Accounts_Online (UserName,UserGuid,UserSystem,UserBrowser,UserUrl,UserIp,ActiveTime,LoginTime)
Values
(@UserName,@UserGuid,@UserSystem,@UserBrowser,@UserUrl,@UserIp,@ActiveTime,@LoginTime)
end
else
begin
Update Accounts_Online set UserUrl=@UserUrl,ActiveTime=@ActiveTime where UserGuid=@UserGuid
end
--删除超时的记录
delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10
Select @Count = Count(UserGuid) from Forum_Online where UserGuid=@UserGuid
IF @Count = 0
begin
Insert Into Forum_Online (UserName,UserGuid,UserSystem,UserBrowser,UserAction,UserIp,ActiveTime,LoginTime,UserbClass,UsersClass)
Values
(@UserName,@UserGuid,@UserSystem,@UserBrowser,@UserAction,@UserIp,@ActiveTime,@LoginTime,@UserbClass,@UsersClass)
end
else
begin
Update Forum_Online set UserAction=@UserAction,ActiveTime=@ActiveTime,UserbClass=@UserbClass,UsersClass=@UsersClass where UserGuid=@UserGuid
end
GO
Public Function OnLineUser(ByVal UserName As String, ByVal UserGuid As String, _
ByVal UserSystem As String, ByVal UserBrowser As String, ByVal UserUrl As String, _
ByVal UserIp As String, ByVal ActiveTime As Date, ByVal LoginTime As Date) As Boolean
Dim rowsAffected As Integer
Dim parameters As SqlParameter() = { _
New SqlParameter("@UserName", SqlDbType.VarChar, 50), _
New SqlParameter("@UserGuid", SqlDbType.VarChar, 50), _
New SqlParameter("@UserSystem", SqlDbType.VarChar, 50), _
New SqlParameter("@UserBrowser", SqlDbType.VarChar, 50), _
New SqlParameter("@UserUrl", SqlDbType.VarChar, 1000), _
New SqlParameter("@UserIp", SqlDbType.VarChar, 30), _
New SqlParameter("@ActiveTime", SqlDbType.DateTime), _
New SqlParameter("@LoginTime", SqlDbType.DateTime)}
------------------------------------------
Public Shared Function OnLineUser() As Boolean
Dim Context As System.Web.HttpContext = System.Web.HttpContext.Current
Dim UserName, UserGuid, UserSystem, UserBrowser, UserUrl, UserIp As String
Dim ActiveTime As Date = Date.Now
Dim LoginTime As Date = Date.Now
UserName = Context.User.Identity.Name
If UserName = "" Then UserName = "Guest User"
If Context.Request.Cookies("myxOnlineUser") Is Nothing Then
UserGuid = System.Guid.NewGuid.ToString
Context.Response.Cookies("myxOnlineUser").Value = UserGuid
Context.Response.Cookies("myxOnlineUser").Expires = Date.Now.AddHours(24)
Else
UserGuid = Context.Request.Cookies("myxOnlineUser").Value
End If
UserSystem = GetUserInfo(Context.Request.UserAgent, 1)
UserBrowser = GetUserInfo(Context.Request.UserAgent, 2)
UserUrl = Context.Request.Url.PathAndQuery.ToString.Trim
UserIp = Context.Request.UserHostAddress
Dim dataUser As New tmpData.User(Configuration.ModuleConfig.GetSqlConnectionString)
Private Shared Function GetUserInfo(ByVal Info As String, ByVal Type As Integer)
Dim GetInfo As String = ""
Select Case (Type)
Case 1
If (Instr(Info, "NT 5.2") > 0) Then
GetInfo = "操作系统:Windows 2003"
ElseIf (Instr(Info, "NT 5.1") > 0) Then
GetInfo = "操作系统:Windows XP"
ElseIf (Instr(Info, "Tel") > 0) Then
GetInfo = "操作系统:Telport"
ElseIf (Instr(Info, "webzip") > 0) Then
GetInfo = "操作系统:操作系统:webzip"
ElseIf (Instr(Info, "flashget") > 0) Then
GetInfo = "操作系统:flashget"
ElseIf (Instr(Info, "offline") > 0) Then
GetInfo = "操作系统:offline"
ElseIf (Instr(Info, "NT 5") > 0) Then
GetInfo = "操作系统:Windows 2000"
ElseIf (Instr(Info, "NT 4") > 0) Then
GetInfo = "操作系统:Windows NT4"
ElseIf (Instr(Info, "98") > 0) Then
GetInfo = "操作系统:Windows 98"
ElseIf (Instr(Info, "95") > 0) Then
GetInfo = "操作系统:Windows 95"
Else
GetInfo = "操作系统:未知"
End If
Case 2
If (Instr(Info, "NetCaptor 6.5.0") > 0) Then
GetInfo = "浏 览 器:NetCaptor 6.5.0"
ElseIf (Instr(Info, "MyIe 3.1") > 0) Then
GetInfo = "浏 览 器:MyIe 3.1"
ElseIf (Instr(Info, "NetCaptor 6.5.0RC1") > 0) Then
GetInfo = "浏 览 器:NetCaptor 6.5.0RC1"
ElseIf (Instr(Info, "NetCaptor 6.5.PB1") > 0) Then
GetInfo = "浏 览 器:NetCaptor 6.5.PB1"
ElseIf (Instr(Info, "MSIE 6.0b") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 6.0b"
ElseIf (Instr(Info, "MSIE 6.0") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 6.0"
ElseIf (Instr(Info, "MSIE 5.5") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 5.5"
ElseIf (Instr(Info, "MSIE 5.01") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 5.01"
ElseIf (Instr(Info, "MSIE 5.0") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 5.0"
ElseIf (Instr(Info, "MSIE 4.0") > 0) Then
GetInfo = "浏 览 器:Internet Explorer 4.0"
Else
GetInfo = "浏 览 器:未知"
End If
End Select
Return GetInfo
End Function
Private Shared Function Instr(ByVal strA As String, ByVal strB As String) As Integer
If (String.Compare(strA, strA.Replace(strB, "")) > 0) Then
Return 1
Else
Return 0
End If
End Function