Asp.Net MVC3.0網站統計登錄認證的在線人數


前言

  對於一個網站來說,統計在線人數是一個很重要的工作。平時也發現很多的網站論壇等都有在線人數的顯示。對於一個網站如果在線人數很多,用戶看到了這么個數字也是很了不起的事情。由於之前對於這個知識點只是知道,並沒有去了解過,這兩天偶然的機會又看到了,於是自己整理了一個簡單的版本,也方便讓大家來給提提意見。

  本文主要通過Application和Session全局來統計在線人數,暫時只統計登錄驗證過的。實現的大致方案如下:

  1、在全局應用程序啟動的時候,Application["count"]=0;初始化統計在線人數為0

  2、處理一個簡單的Form登錄認證,在登錄的時候對全局變量Application["count"]進行累加1的操作。同時,在登錄的時候寫入Session值,設置一個有效的時間為1分鍾(多長時間根據需要,這里只是作為測試使用)。

  3、在Session失效、用戶登出、瀏覽器關閉的情況觸發,全局的會話函數進行對全局變量Application["count"]進行累減1的操作。

  有關Session的知識可以參考http://www.cnblogs.com/Jolinson/p/3604512.html

正文

 第一步:新建一個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進行測試哦。如果發現問題希望及時通知,以便對方案進行更改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM