你写一个函数,然后在page_load里调用 OnLineUser()就OK了. 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)} parameters(0).Value = UserName parameters(1).Value = UserGuid parameters(2).Value = UserSystem parameters(3).Value = UserBrowser parameters(4).Value = UserUrl parameters(5).Value = UserIp parameters(6).Value = ActiveTime parameters(7).Value = LoginTime RunProcedure( _ "sp_Accounts_OnLineUser", parameters, rowsAffected) Return CBool(rowsAffected = 1) End Function------------------------------------------ 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) Return dataUser.OnLineUser(UserName, UserGuid, UserSystem, UserBrowser, UserUrl, UserIp, ActiveTime, LoginTime) End Function 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-------------------------------
SQL --------------------------- CREATE PROCEDURE sp_Forums_OnLineUser ( @UserName varchar(50), @UserGuid uniqueidentifier, @UserSystem varchar(50), @UserBrowser varchar(50), @UserAction varchar(1000), @UserIp varchar(30), @ActiveTime dateTime, @LoginTime datetime, @UserbClass int, @UsersClass int ) AS DECLARE @Count int --删除超时的记录 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
--删除超时的记录 delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10这就是删除超时的.如果在线10分不活动就删除.也可以把这时间缩小.看自己定了.如果离开页面就会马上更新数据. 刚才那SQL主要是删除不在线的用户和长时间不活动的用户.
刚才SQL是这个.不好意思,发错了. ---------------------------------CREATE PROCEDURE sp_Accounts_OnLineUser ( @UserName varchar(50), @UserGuid uniqueidentifier, @UserSystem varchar(50), @UserBrowser varchar(50), @UserUrl varchar(1000), @UserIp varchar(30), @ActiveTime dateTime, @LoginTime datetime ) AS DECLARE @Count int --删除超时的记录 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 endGO
假使有用户A使用 该页面5秒后,第六秒时用户B登录,能够知道当前有用户A在线 而如果A在第5秒时,按了“关闭”按钮,退出了改页面,假设系统超时为10分钟 那么(delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10)是不起做用的,所以数据库里仍认为用户A在线,而其实A已经退出系统了。请问myexam(exam) 以及其它高人,这个问题怎么解决?
UP AND GZ
字段包括:
SessionID varchar
starttiem datetime
lasttime datetime
ip varchar
UserID nvarchar
每个用户访问站点时,就会创建一个Session,每个Session会有一个SessionID,
向数据库中插入这个用户的信息;
当再点击网站的内容时就修改这个用户的lasttime;
如果这个用户在一个回话时间内还没有活动的话,就将这个用户删除!
原理是这样的,欢迎指教!
你要是想实现就在客户端实现。捕捉客户端鼠标事件。
比如:
鼠标在你的页面上的时候你将访问者名字(session里面的)提交到一个处理(插入正在访问表)。
当将鼠标离开你的页面的时候再将访问者的名字(session里面的)再提交到那个页面处理(从正在访问表中删除)
像上面那样。。当鼠标移到页面上的时候执行insert();当鼠标移出你的页面的时候执行delete();哈。。这样也许符合楼主的意图。。
也可以参照楼主xzq686(瞬)的做法
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)} parameters(0).Value = UserName
parameters(1).Value = UserGuid
parameters(2).Value = UserSystem
parameters(3).Value = UserBrowser
parameters(4).Value = UserUrl
parameters(5).Value = UserIp
parameters(6).Value = ActiveTime
parameters(7).Value = LoginTime RunProcedure( _
"sp_Accounts_OnLineUser", parameters, rowsAffected) Return CBool(rowsAffected = 1) End Function------------------------------------------
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) Return dataUser.OnLineUser(UserName, UserGuid, UserSystem, UserBrowser, UserUrl, UserIp, ActiveTime, LoginTime)
End Function
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-------------------------------
---------------------------
CREATE PROCEDURE sp_Forums_OnLineUser
(
@UserName varchar(50),
@UserGuid uniqueidentifier,
@UserSystem varchar(50),
@UserBrowser varchar(50),
@UserAction varchar(1000),
@UserIp varchar(30),
@ActiveTime dateTime,
@LoginTime datetime,
@UserbClass int,
@UsersClass int
)
AS
DECLARE @Count int --删除超时的记录
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
多问一句,是不是用户离开页面后会从数据库里清除其相应信息?
--删除超时的记录
delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10这就是删除超时的.如果在线10分不活动就删除.也可以把这时间缩小.看自己定了.如果离开页面就会马上更新数据. 刚才那SQL主要是删除不在线的用户和长时间不活动的用户.
---------------------------------CREATE PROCEDURE sp_Accounts_OnLineUser
(
@UserName varchar(50),
@UserGuid uniqueidentifier,
@UserSystem varchar(50),
@UserBrowser varchar(50),
@UserUrl varchar(1000),
@UserIp varchar(30),
@ActiveTime dateTime,
@LoginTime datetime
)
AS
DECLARE @Count int --删除超时的记录
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
endGO
而如果A在第5秒时,按了“关闭”按钮,退出了改页面,假设系统超时为10分钟
那么(delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10)是不起做用的,所以数据库里仍认为用户A在线,而其实A已经退出系统了。请问myexam(exam) 以及其它高人,这个问题怎么解决?
在body里添加onload和onbeforeunload事件,<body onload="onpage('onpage.aspx',1)" onbeforeunload="onpage('onpage.aspx',0)">onpage函数用来打开一新窗口(onpage.aspx),此窗口执行完事件后自动关闭,onpage.aspx的功能是前面几位DX提到的,在数据库里保存用户-页面状态。