• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

如何获得当前页面正在有哪些用户访问——在线等!

zcwmxn 2004-11-15 10:38:42
如题,如果觉得我描述不清,请留言
...全文
289 点赞 收藏 29
写回复
29 条回复
zcwmxn 2004年11月16日
偶突然想出一办法,大家来点评一下
在body里添加onload和onbeforeunload事件,<body onload="onpage('onpage.aspx',1)" onbeforeunload="onpage('onpage.aspx',0)">

onpage函数用来打开一新窗口(onpage.aspx),此窗口执行完事件后自动关闭,onpage.aspx的功能是前面几位DX提到的,在数据库里保存用户-页面状态。
回复 点赞
zcwmxn 2004年11月16日
明白您说的意思,只是如果用户退出后,怎么处理?比如用户点了“关闭”,怎么能够知道用户已经退出了此页面
回复 点赞
zcwmxn 2004年11月16日
回复 点赞
vzxq 2004年11月15日
如果当前页面用户打开了,但是不是活动的,算正在访问吗?
回复 点赞
zcwmxn 2004年11月15日
多谢 myexam(exam) ;您能不能帮我把我所描述的问题解决,那样就应该可以彻底搞定了
回复 点赞
zcwmxn 2004年11月15日
呵呵, 多谢fly980218(天魔六少)。为什么是session呢?你对session了解多少呢?
回复 点赞
zcwmxn 2004年11月15日
也有可能,用户只是离开了页面,并没有离开系统
回复 点赞
fly980218 2004年11月15日
应该是用session记录吧~~
回复 点赞
zcwmxn 2004年11月15日
假使有用户A使用 该页面5秒后,第六秒时用户B登录,能够知道当前有用户A在线
而如果A在第5秒时,按了“关闭”按钮,退出了改页面,假设系统超时为10分钟
那么(delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10)是不起做用的,所以数据库里仍认为用户A在线,而其实A已经退出系统了。请问myexam(exam) 以及其它高人,这个问题怎么解决?
回复 点赞
myexam 2004年11月15日
刚才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
end

GO
回复 点赞
myexam 2004年11月15日
回复人: zcwmxn(千里猪) ( ) 信誉:100 2004-11-15 12:18:00 得分: 0


多问一句,是不是用户离开页面后会从数据库里清除其相应信息?




--删除超时的记录
delete from Forum_Online where Datediff(minute,ActiveTime,getdate())>10

这就是删除超时的.如果在线10分不活动就删除.也可以把这时间缩小.看自己定了.如果离开页面就会马上更新数据. 刚才那SQL主要是删除不在线的用户和长时间不活动的用户.


回复 点赞
zcwmxn 2004年11月15日
多问一句,是不是用户离开页面后会从数据库里清除其相应信息?
回复 点赞
myexam 2004年11月15日
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
回复 点赞
myexam 2004年11月15日
你写一个函数,然后在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

-------------------------------
回复 点赞
Jack2013tong 2004年11月15日
其实方法很多,关键看你怎么去做,你可以在进入该页面的时候为用户设个session,
也可以参照楼主xzq686(瞬)的做法
回复 点赞
zcwmxn 2004年11月15日
xzq686(瞬) ,哈,不是玩我吧?开玩笑,不过你这样做是不是太不科学了?
回复 点赞
xzq686 2004年11月15日
<body onmouseover="javascript:insert()" onmouseout="javascript:delete()">
像上面那样。。当鼠标移到页面上的时候执行insert();当鼠标移出你的页面的时候执行delete();

哈。。这样也许符合楼主的意图。。
回复 点赞
xzq686 2004年11月15日

你要是想实现就在客户端实现。捕捉客户端鼠标事件。
比如:
鼠标在你的页面上的时候你将访问者名字(session里面的)提交到一个处理(插入正在访问表)。
当将鼠标离开你的页面的时候再将访问者的名字(session里面的)再提交到那个页面处理(从正在访问表中删除)
回复 点赞
galahadzzy 2004年11月15日
恩。。。就是不太精确?!。。
回复 点赞
来客心动 2004年11月15日
用SessionID去唯一标记一个用户是最可靠的!

建一个表,
字段包括:
SessionID varchar
starttiem datetime
lasttime datetime
ip varchar
UserID nvarchar
每个用户访问站点时,就会创建一个Session,每个Session会有一个SessionID,
向数据库中插入这个用户的信息;
当再点击网站的内容时就修改这个用户的lasttime;
如果这个用户在一个回话时间内还没有活动的话,就将这个用户删除!
原理是这样的,欢迎指教!
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告