关于用户非正常退出时同步他的在线状态问题。

学好技术天天向上 2016-10-16 10:47:03
现在有一个网站,用户如果正常点击页面的退出按钮当然是没问题,但是如果用户是直接关闭浏览器或者关机 断网之类的情况下,要怎么实现这个同步在线状态功能呢?? 有考虑到session的过期,但是session过期是有一定时间的,不能实现同步, 而且用session过期时也不知道怎么取这个session的数据(如用户的id), 有没有大神能解惑呀,,这该怎么做呢。 ps: C#写的。
...全文
484 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这就好像你去判断一个人是不是你们公司的人,只要没有办法员工登记册上看到他的登记,那么你就可以说“他不是我们公司的人”。你不应该纠结于他不在你们公司时还必须在员工登记册上登记“不在公司”的问题。 所有认识都要根据现实而灵活变通。这个变通的思路的关键,就好像上面的“登记册”一样,需要能够全盘接受完全“反过来”的设计。
  • 打赏
  • 举报
回复
这个最后访问时间的意思有明白了,之前一直纠结于其它的设想限制了思路。现在比如有个页面是显示当前在线用户,那么在该页面取数时用上这最后访问来进行筛选想想是可行的,但这依靠 用户操作 来更新在线状态 可行吗,还是说干脆也不存什么状态字段了,在取数的时候根据最后访问来显示一个状态值呢
  • 打赏
  • 举报
回复
呃 我的检查意思就是 检查最后访问时间
  • 打赏
  • 举报
回复
这种心跳包有考虑过,但不知具体实现思路。 是用计时器来每隔 假设一分钟 来检查么?
王志威丶 2016-10-19
  • 打赏
  • 举报
回复
学到了
  • 打赏
  • 举报
回复
如果你真的不能理解软件设计的概念,那你总会看懂 select ..... from [your table] where t < @1分钟前 和 select ..... from [your table] where s=0 这样两条语句的区别吧? 不过就是修改一下查询条件而已。不要多想什么复杂机制、给自己制造性能和维护上的麻烦。
  • 打赏
  • 举报
回复
你判断是否在线,需要计算最后访问时间是否“小于”1分钟之前的时间点,而不是判断什么“在线状态”bool值。这个理解不了? 根本不需要做什么“定时检查”。
  • 打赏
  • 举报
回复
引用 7 楼 qq_33803784 的回复:
这种心跳包有考虑过,但不知具体实现思路。 是用计时器来每隔 假设一分钟 来检查么?
谁跟你说“检查”了?你只是需要登记“最后访问时间”。
xuzuning 2016-10-19
  • 打赏
  • 举报
回复
都已经断线了,还同什么步? 你要做的只是垃圾回收,定时保洁是可以接受的
  • 打赏
  • 举报
回复
一般判断是否在线用的是发送心跳数据,也叫心跳包,这个包一般很小。你定义一个特殊意义发字段,每个一段时间网页程序向服务器发送一个心跳,服务器收到这个用户发来的心跳,则说明这个用户在线,一段时间内没收到就说明不在线。就像人的心脏,每隔一段时间跳动一下。
  • 打赏
  • 举报
回复
如果你开发的是富客户端 web 应用程序,那么单一一个 html 页面就是一个应用程序,页面并不回发刷新,html中通过多个 <div> 来动态切换“页面”视图(而不是切换传统的 <html> 页面),那么你就可以使用 websocket 保持前端应用与服务器的“长连接”。此时,websocket 可以获得“Closed”事件通知,可以实时更新“离线”状态。 而传统的 web 根本就是无状态的,页面随时重定向、刷新。因此根本不存在长连接,根本不能将实时状态作为一个 bool 标志来理解。
  • 打赏
  • 举报
回复
web是无状态的。在后台数据中,应当记录有每一个会话的“最后访问时间”。例如你规定当最后访问时间超过1分钟则算是“离线”,你可以在aspx中前端定时每隔30秒钟使用ajax来访问一次某个 ashx,来更新此“最后访问时间”记录,以此作为“心跳信号”。 当你的程序需要知道某个用户是否离线,是不可能用一个bool标志来判断的,必须临时计算一下此“最后访问时间”是否在1分钟之前,这样才能判断。
SoulRed 2016-10-17
  • 打赏
  • 举报
回复
考虑到浏览器众多,内核百家齐鸣,而且你不能约束用户指定用某种浏览器,所以最好的解决方法是在服务器设置心跳包,定期检测用户是否还在线。
  • 打赏
  • 举报
回复
引用 1 楼 zhi_ai_yaya 的回复:
C# 在session结束时有个事件的。关闭浏览器会触发session结束事件。
但是在这个方法里,这时候这个session已经是失效的 没办法取到里面的信息了 。 比如用户 A 登录 ,创建了一个session["userId"] ="1" 用户关闭浏览器,等到该session过期时间到的时候执行 Global.asax的session_End 方法时, session["userId"]是 null 了。
我叫小菜菜 2016-10-16
  • 打赏
  • 举报
回复
C# 在session结束时有个事件的。关闭浏览器会触发session结束事件。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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