博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录用户在线时间
阅读量:7037 次
发布时间:2019-06-28

本文共 951 字,大约阅读时间需要 3 分钟。

前言                                   

  同事在弄一个叫学习空间的系统,其中需要记录用户的在线时间,于是我就帮忙实现一下,那个系统的其他部分都没参与过。不过功能实现得还可以,就小结一下也看看能不能有更好的解决方法。

 

正文                                   

  思路:在页面加载和卸载时的把当前时刻发送到服务器,服务器端用链表保存并且该链表保存在Session中,但Session过期时检索该链表获取最小和最大值并相减,那就得到了用户在线时间了。

  前提:Session mode要设为 InProc,不然永不过期哦!

下面是具体实现例子:

     目录结构

RecordTime用于记录加载、卸载、登录、退出的时刻;

Logout处理注销操作;

Global.asax中的Session_End方法用于处理链表并获取、保存最终在线时间结果。

AjaxHasPool是自己封装的Ajax调用对象,图个方便而已!

源代码使用说明:在Global.asax的Session_End方法中设断点,使用调试模式启动就可以看到结果值。

插曲:本来打算在Session_End中使用HttpContext.Current.Application来保存结果值,然后再获取并显示到页面上。不料原来在Session_End中是获取不料HttpContext.Current。具体原因是:Session_End事件是由服务器内部激发的事件处理函数,由服务器的内部计时器启动,这时服务器没有接收到相关的请求就没有进入管道模型中生成HttpContext对象,所以无法获取HttpContext.Current对象,就更别说什么Application、Request对象了。而Session_End事件的发生时间是1.Session过期;2.调用Session.Abandon()后,该次请求/响应处理结束时,所以执行Session.Abandon()后,客户端必须至少有一次请求,才能正确反应Session的状态。

参考:

注意:因Session是保存在Asp.net进程的AppDomain中,当进程结束或崩溃时会触发Session_End事件。

转载地址:http://oonal.baihongyu.com/

你可能感兴趣的文章
如何让PPTP协议通过juniper防火墙
查看>>
git安装及汉化
查看>>
roundcube 修改附件上传大小的限制
查看>>
为什么我们使用Nginx而不是Apache?
查看>>
SpringMVC 配置篇
查看>>
yum 使用socks5代理
查看>>
产品经理怎么和美工打交道【4】
查看>>
云主机迁移脚本
查看>>
集群概述及原理笔记
查看>>
使用udev管理asmdisk执行/sbin/scsi_id不显示UUID解决方法
查看>>
Spring Security 学习之OpenID认证
查看>>
搭建开发使用的DNS服务器
查看>>
一般我只更新QQ空间和QQ微博
查看>>
JVM 内部运行线程介绍
查看>>
设计模式-策略模式
查看>>
一次jvm进程内存泄露问题的处理
查看>>
Centos7.2搭建SVN服务端完整配置
查看>>
基于zbus的MySQL透明代理(<100行)
查看>>
学习 Dialplan 1
查看>>
CentOS / Redhat EL 打开 sudo 功能
查看>>