求助~~ 如何控制一个用户在同一时间只能在一台机子上登录??

qq346127416 2011-01-07 02:49:05
如果这个用户处于已登录状态 那么在其他机子上用这个用户名登陆的话就会提示“该用户正在别的地方登陆”

请问这个怎么实现 如何判断一个用户是否处于登录状态。。。

谢谢~~

网上说加一个登录状态字段 可以这样用户要是不点退出或注销 直接关闭浏览器的话 那么那个状态字段的值就该不回去了
也就无法正常登陆了。。

还有什么好方法么 ~~~
...全文
430 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
IHandler 2011-01-10
  • 打赏
  • 举报
回复
1、使用数据库全局临时表
2、将用户标识记录在Application,用户登录时进行比对
xxoo2007 2011-01-10
  • 打赏
  • 举报
回复
Session_End不靠谱,唯有心跳才是最准确的办法.

如果不想心跳的话,也可以试试记录访问日志的办法,每个请求都记录到数据库里,判断的时候看下用户的最后一次活动在什么时间.设置个范围,超出范围表示下线.这种做法有个好处,以后扩展流量分析,用户活动分析什么的就方便了哈
wulumuqu 2011-01-10
  • 打赏
  • 举报
回复
"心跳包",这个名词有意思。不过总觉得增加了服务器与客户端的额外网络负载,心中不爽。或者服务器记录客户端最后一次访问时间,并定时清理,毕竟没办法确保服务器一定接收到客户端的注销事件。
署名:挣积分。
qq346127416 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 ycl1314 的回复:]
Session_End
[/Quote]

我试了一下 Session_End 只有session过期或结束会话的时候执行 直接关闭浏览器不会执行的
我试了好多js关闭浏览器事件也不管用。。
ycl1314 2011-01-10
  • 打赏
  • 举报
回复
Session_End
qq346127416 2011-01-10
  • 打赏
  • 举报
回复
谢谢楼上各位。。期待更好的答案
小_虎 2011-01-08
  • 打赏
  • 举报
回复
关于服务器压力的东西,我不敢下结论,如果别人都说压力太大了,也没有人给出具体的测试数据。
小_虎 2011-01-08
  • 打赏
  • 举报
回复
每隔一分钟发送一个“心跳包”包含当前的SessionID证明你还在,服务器每次判断登录都从缓存集合中判断所有用户,看看那是否所有的用户的最后心跳时间+1分钟是否小于现在的时间。否则就把他从集合中Remove掉。

然后再判断他在缓存集合总当前的用户Id是否存在。
kocokolo 2011-01-08
  • 打赏
  • 举报
回复
如果你能保证用户能按正常的流程登陆,注销那这个问题还好办,但是有时候用户不是按照这个约定去办或者不能譬如电脑突然断电或死机了。可不可以用Cache对象保存,Cache对象有个过期的问题,可以利用一下。不过你需要时时的去维护这个对象,不让它超时。不知道可行不可行。
fabulous 2011-01-07
  • 打赏
  • 举报
回复
这问题见了不下10次,每次都没见到过最完美的解决办法。
各种关闭状态都考虑貌似很麻烦。
duduqiao 2011-01-07
  • 打赏
  • 举报
回复
先顶再看看如何设置
showjim 2011-01-07
  • 打赏
  • 举报
回复
要绝对可靠,只能不停的ajax请求告诉服务器我还在。可以通过cookie防止多个页面同时请求的问题。

大Y 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 laowang134 的回复:]
如果最后的回发时间距离当前时间大于20秒证明,已经退出登录了。。
[/Quote]

是可以用ajax来判断 但一定会有最后一次发送是吧,那还是没有问题,如果用户离开网页了,ajax也没法传送数据了,对比也是不可以的了,

楼主可以查下,加上用ajax这种情况,然后,用户离开页面的几种情况!!!结合我觉的就可以了吧!!!
generhappy 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 generhappy 的回复:]
直接关闭浏览器,可以用js捕捉到。。
<body onunload="leave()">

<script type="text/javascript">

function leave()
{
。。。。清空登录信息,修改sql该用户的在线状态
}
</script>
[/Quote]

忘记说了 onunload 在ie6里没有用。。
generhappy 2011-01-07
  • 打赏
  • 举报
回复
直接关闭浏览器,可以用js捕捉到。。
<body onunload="leave()">

<script type="text/javascript">

function leave()
{
。。。。清空登录信息,修改sql该用户的在线状态
}
</script>
qq346127416 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 generhappy 的回复:]
哈哈,我的项目上用了一个在线用户表,sql里有一个在线用户表,登录前先查询该用户是否在线。。。。
[/Quote]

那要是用户直接关闭浏览器或重启计算机,那怎么把这个用户 从 在线用户表 里删除呢。。。
qq346127416 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fangxinggood 的回复:]
网上说加一个登录状态字段 可以这样用户要是不点退出或注销 直接关闭浏览器的话 那么那个状态字段的值就该不回去了
也就无法正常登陆了。。

--------

在Session_End里重置一下就可以了。
Global.asax

C# code
void Session_End(object sender, EventArgs e)
{
// Code that r……
[/Quote]

我刚才试了一下 执行Session.Abandon()之后 会执行Session_End(object sender, EventArgs e)方法 。。 直接关闭浏览器还是不执行 Session_End 方法。。。。。
generhappy 2011-01-07
  • 打赏
  • 举报
回复
哈哈,我的项目上用了一个在线用户表,sql里有一个在线用户表,登录前先查询该用户是否在线。。。。
Miao 2011-01-07
  • 打赏
  • 举报
回复
不知到了
加载更多回复(12)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧