Asp.Net MVC3.0网站统计登录认证的在线人数
Asp.Net MVC3.0网站统计登录认证的在线人数
前言
对于一个网站来说,统计在线人数是一个很重要的工作。平时也发现很多的网站论坛等都有在线人数的显示。对于一个网站如果在线人数很多,用户看到了这么个数字也是很了不起的事情。由于之前对于这个知识点只是知道,并没有去了解过,这两天偶然的机会又看到了,于是自己整理了一个简单的版本,也方便让大家来给提提意见。
本文主要通过Application和Session全局来统计在线人数,暂时只统计登录验证过的。实现的大致方案如下:
1、在全局应用程序启动的时候,Application["count"]=0;初始化统计在线人数为0
2、处理一个简单的Form登录认证,在登录的时候对全局变量Application["count"]进行累加1的操作。同时,在登录的时候写入Session值,设置一个有效的时间为1分钟(多长时间根据需要,这里只是作为测试使用)。
3、在Session失效、用户登出、浏览器关闭的情况触发,全局的会话函数进行对全局变量Application["count"]进行累减1的操作。
正文
第一步:新建一个Asp.Net MVC3.0的Web项目,选择Razor引擎。设置初始在线人数。在Global.asax文件中找到Application_Start。

protected void Application_Start()
{
Application["count"] = 0; ///在应用程序第一次启动时初始化在线人数为0
AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

第二步:简单修改登录验证,认证成功,写入Session值,并对在线人数进行加1的处理。

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid) ////简单的验证即为登录有效
{
//会话标示写入Session值,并设置有效时间
System.Web.HttpContext.Current.Session.Add("SessionID", Guid.NewGuid().ToString());
System.Web.HttpContext.Current.Session.Timeout = 5;
///登录成功,对在线人数全局变量进行加1处理
System.Web.HttpContext.Current.Application["count"] = Convert.ToInt32(System.Web.HttpContext.Current.Application["count"]) + 1;
if (Request.QueryString["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(model.UserName, false);
}
else
{
FormsAuthentication.SetAuthCookie(model.UserName, false);
return RedirectToAction("Index", "Home");
}
}
return View(model);
}

第三步:在全局Global.asax文件中添加Session_End中,即会话结束(登出,浏览器关闭,Session到期失效)
protected void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["count"] = Convert.ToInt32(Application["count"]) - 1;
Application.UnLock();
}
这样要要记得加锁处理,因为可能有并发的问题。登录的时候也要进行加锁和解锁的处理,上面没加而已。
第四步:对于登出的Action进行处理如下:
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
System.Web.HttpContext.Current.Session.Abandon();//取消当前会话
return RedirectToAction("Index", "Home");
}
取消当前会话,这样才会触发在上面定义的全局的Session_End函数。
第五步:在布局模版中的body标签中添加onbeforeunload事件。

由于该事件在刷新和关闭的时候都会调用,所以在实现时做如下处理:

<script type="text/javascript">
function PageClose() {
var n = window.event.screenX - window.screenLeft;
var b = n > document.documentElement.scrollWidth - 20;
if (b && window.event.clientY < 0 || window.event.altKey) {
alert("是关闭而非刷新");
if ('@Request.IsAuthenticated' == 'True') {
window.location.href = "../Account/ClosePage";
}
}
else {
alert("是刷新而非关闭");
}
}
</script>

此时关闭的情况调用的Action如下:
public void ClosePage()
{
FormsAuthentication.SignOut();
System.Web.HttpContext.Current.Session.Abandon();//取消当前会话
}
总结
实例下载链接为http://pan.baidu.com/share/link?shareid=1839967473&uk=4244870074,可以下载项目,运行进行测试即可,暂时本人用IE8测试功能基本实现。针对关闭浏览器网页触发事件,兼容各个浏览器的问题暂未考虑,如果你对此感兴趣,记得先用IE进行测试哦。如果发现问题希望及时通知,以便对方案进行更改。
Asp.Net MVC3.0网站统计登录认证的在线人数的更多相关文章
- Asp.Net MVC3.0项目部署到Win7 64过程总结
前言 之前一直是通过Visual Studio直接F5来运行自己编写的项目或者小程序,很少通过部署发布到IIS上面,于是自己便在自己的笔记本上进行测试,结果还真是发现了不少问题,于是自己重新通过虚机程 ...
- asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction
asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction 1.带有Render的方法返回值是v ...
- Log4Net异常日志记录在asp.net mvc3.0的应用
前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...
- Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...
- asp.net mvc3.0第一个程序helloworld开发图解
步骤一:新建asp.net mvc3.0项目 (选择Razor模板) 步骤二:创建控制器 步骤三:控制器源码内右键创建对应视图 步骤四:控制器内添加代码 步骤五:视图页面输出内容 步骤六:F5调试
- Asp.Net Mvc3.0(MEF依赖注入实例)
前言 在http://www.cnblogs.com/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍.本节主要来介绍如何在Asp.Net Mvc3.0中使用MEF. 准 ...
- asp.net mvc3.0安装失败之终极解决方案
安装失败截图 原因分析 因为vs10先安装了sp1补丁,然后安装的mvc3.0,某些文件被sp1补丁更改,导致“VS10-KB2483190-x86.exe”安装不了,造成安装失败. 解决方案 方法1 ...
- 经典ASP.NET MVC3.0入门详解
http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...
- 【翻译】asp.net core2.0中的token认证
原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...
随机推荐
- jdk和eclipse位数不一致出错
32位的eclipse无法打开:找不64位jdk6的jvm.dll文件(64位的没有这个文件).网上说法可以通过设置eclipse初始化文件xxx.ini改变方式: 直接换成了同位数的了,没去试了.
- 转:HTTP 301 跳转和302跳转的区别
301和302 Http状态有啥区别?301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently ...
- Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
原文:http://blog.csdn.net/lifuxiangcaohui/article/details/37659905 一直用tomcat一段时间都正常无事,最近一次启动tomcat就发生以 ...
- [转]C++中引用(&)的用法和应用实例
from: here 对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符 ...
- 转:为什么C++中空类和空结构体大小为1?
参考:http://www.spongeliu.com/260.html 为什么C++中空类和空结构体大小为1? On November 17, 2010, in C语言, 语言学习, by spon ...
- git 10.8
git clone xxxx.git生成一个本地的文件夹acd agit checkout -b abcgit checkout mastergit pull然后数据全部由更新 但是是远程的更新 不能 ...
- php imagecreatetruecolor输出字符符或验证码
$img = imagecreatetruecolor(100,100); //创建真彩图像资源 $color = imagecolorAllocate($img,200,200,200); //分配 ...
- PacBio长reads的大基因组组装
原文链接:Large Genome Assembly with PacBio Long Reads 可以以多种方式利用PacBio长reads来生成和改进大型基因组的de novo组装. 你可以用几种 ...
- MySQL高可用性分析
版权声明:本文由易固武原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/203 来源:腾云阁 https://www.qclo ...
- java 模板
模板模式: 解决某类事情的步骤有些是固定的,有些是会发生变化的,这时我们提供 一个模板代码,从而提高效率. 模板模式的作用: 1.解决这类事情其中一件的解决方案. 2.分析代码,把发生变化的代码抽象取 ...