zoukankan      html  css  js  c++  java
  • 一个比较精确的“在线用户列表”统计功能

    原帖:http://community.csdn.net/Expert/topic/3835/3835032.xml?temp=.1909601 
    感谢:Afritxia (能活不易) 


    当用户访问网站时,会为他分配一个SessionID。令用户的IP地址和用户名称建立一个一一对应的关系。如果用户开启了新的窗口,则检查用户的IP地址或用户名是否已经在OnlineUsersHash中出现过?如果出现过,就让新的SessionID指向现有的IP地址。而当一个Session结束时,则将该SessionID从OnlineUsers_SessionIPHash中移除。判断是否还有其他SessionID指向这个IP地址,如果没有,那么从在线用户列表中移除用户名称。客户端的情况相当复杂,必须要考虑周全。下面则是新的算法的代码: 

    // 在Global.asax.cs 文件中 
    // 
    // 在线用户列表主键名 
    public const string KEY_ONLINEUSERS="OnlineUsers"
    // 在线用户列表 Session 表主键名 
    public const string KEY_ONLINEUSERS_SESSIONIP="OnlineUsers_SessionIP"

    protected void Application_Start(Object sender, EventArgs e) 

    Application.Lock(); 

    Application[KEY_ONLINEUSERS]
    =null
    Application[KEY_ONLINEUSERS_SESSIONIP]
    =null;// 目的是将用户的SessionID和IP对应起来 

    Application.UnLock(); 
    }
     
      
    protected void Session_Start(Object sender, EventArgs e) 

    Application.Lock(); 

    /*  */

    Hashtable onlineUsersHash
    =(Hashtable)Application[KEY_ONLINEUSERS]; 
    Hashtable onlineUsersSessionIPHash
    =(Hashtable)Application[KEY_ONLINEUSERS_SESSIONIP]; 

    if(Visitor.Current.IsGuest)// 如果用户是来宾 

    if(onlineUsersHash.ContainsKey(Request.UserHostAddress)) 

    onlineUsersHash[Request.UserHostAddress]
    =""
    }
     
    else 

    onlineUsersHash.Add(Request.UserHostAddress, 
    ""); 
    }
     
    }
     
    else 

    if(!onlineUsersHash.ContainsKey(Request.UserHostAddress) 
    && !onlineUsersHash.ContainsValue(Visitor.Current.UserName)) 

    // 如果用户的 IP 地址和用户名称在列表中找不到,则将添加在线用户列表中 
    onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value); 
    }
     
    else if(onlineUsersHash.ContainsValue(Request.Cookies[“UserName”].Value)) 

    // 如果用户的 Cookie 信息能够找到,则更新(先删除再添加)在线用户的 IP 地址 
    // 
    // 说明:用户可能刚登陆不久,便因为线路故障,断线并重新拨号 
    // 而当用户回到网站时,用户的 Cookie 还未过期,但是 IP 地址却发生了改变 
    string userName=Request.Cookies[″UserName″].Value; 

    foreach(object key in onlineUsersHash.Keys) 

    if(((string)onlineUsersHash[key]).Equals(userName)) 

    // 删除用户刚才使用过的 IP 地址 
    onlineUsersHash.Remove(key); 
    break
    }
     
    }
     

    // 添加在线用户 
    onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value); 
    }
     
    else if(onlineUsersHash.ContainsKey(Request.UserHostAddress)) 

    // 如果用户的 IP 地址能找到,则更新在线用户的名称 
    // 
    // 说明:用户登录后,注销并重新登陆。可能是去换个用户名 
    onlineUsersHash[Request.UserHostAddress]=Request.Cookies[″UserName″].Value; 
    }
     
    }
     

    // 将用户的 IP 地址和 SessionID 对应起来 
    if(!onlineUsersSessionIPHash.ContainsKey(Session.SessionID)) 
    onlineUsersSessionIPHash.Add(Session.SessionID, Request.UserHostAddress); 

    Application.UnLock(); 
    }
     

    protected void Session_End(Object sender, EventArgs e) 

    Application.Lock(); 

    if(Application[KEY_ONLINEUSERS]!=null

    Hashtable onlineUsersHash
    =(Hashtable)Application[KEY_ONLINEUSERS]; 
    Hashtable onlineUsersSessionIPHash
    =(Hashtable)Application[KEY_ONLINEUSERS_SESSIONIP]; 

    // 获取用户的IP地址 
    string IP=(string)onlineUsersSessionIPHash[Session.SessionID]; 

    // 移除用户的IP地址 
    onlineUsersSessionIPHash.Remove(Session.SessionID); 

    // 如果没有一个Session指向这个IP了,则说明这个用户确实已经离开了网站 
    // 可以删除该用户的用户名称了 
    if(!onlineUsersSessionIPHash.ContainsValue(IP)) 
    onlineUsersHash.Remove(IP); 
    }
     

    Application.UnLock(); 
    }
     


  • 相关阅读:
    Oracle数据库测试和优化最佳实践: OTest介绍 (转)
    Oracle数据库中心双活之道:ASM vs VPLEX (转)
    awrcrt更新到2.1(重大更新)
    Oracle性能图表工具:awrcrt.sql 介绍,更新到了2.14 (2018年3月31日更新)
    java虚拟机---内存
    如何进行高效的学习
    OpenGL绘制自由落体小球
    MDA系统分析实战--图书馆管理系统
    Python爬虫实战---抓取图书馆借阅信息
    Python--urllib3库详解1
  • 原文地址:https://www.cnblogs.com/kokoliu/p/618143.html
Copyright © 2011-2022 走看看