在线登录用户统计

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
        在线登录用户统计只统计登录后的在线用户,忽略未登录的用户,并且同一帐号不允许多次登录,即当用户登录时,如果该用户帐号已经在其他地方登录,则自动踢出之前登录的用户。登录标识为Session中logonUserView属性是否为null。实现原理:借助HttpSessionAttributeListener和HttpSessionListener来实现。用户登录时,如果密码验证通过,则判断改用户是否已经登录,如果已经登录则将之前登录的用户强制注销,然后将记录这用户信息的LogonUserView对象放入当前session,这时候HttpSessionAttributeListener的attributeAdded事件被触发,该用户被记录到在线用户列表。用户注销时或Session自动失效时,会触发HttpSessionListener的sessionDestroyed事件,从在线用户列表中移除注销用户。具体实现代码如下:

1. LogonUserView类,记录登录后用户信息

public class LogonUserView implements java.io.Serializable {
    private String userid;
    private String userName;
    // 省略其他属性和get、set方法
}
2. OnlineUserView类,记录在线用户信息

public class OnlineUserView {
    private String userId;
    private String userName;
    private String loginIP;
    // 在线用户对应Session,踢用户时使用
    private HttpSession userSession;
    // 省略其他属性和get、set方法
}
3. 登录方法(片段)

// 检测是否是在不同浏览器下已有相同用户Id的用户登陆
List onlineUsers = OnlineUserListener.getOnlineUsers();
for(int i = 0; i < onlineUsers.size(); i++){
    // 在线用户视图
    OnlineUserView onlineUserView = (OnlineUserView)onlineUsers.get(i);
    // 在线用户Session
    HttpSession onlineUserSession = onlineUserView.getUserSession();
    // 同一用户
    if(authorizedUserId.equals(onlineUserView.getUserId())){
        // 在不同机器上登陆,提示,否则不提示
        if(!request.getRemoteAddr().equals(onlineUserView.getLoginIP())){
            // 提示信息
        }
        try{
            if(!onlineUserSession.getId().equals(request.getSession().getId())){
                // 强制注销之前登陆用户,并将该用户从在线用户列表删除
                onlineUserSession.invalidate();
            }
        }catch(IllegalStateException ise){}
        break;
    }    
}
                
// 绑定登陆用户信息到Session,监听器自动将该用户添加到在线用户列表
request.getSession().setAttribute("logonUserView", logonUserView);
4. 注销方法(片段)

// 使session失效,触发sessionDestroyed事件,从在线用户列表中移除注销用户
session.invalidate();
5. 在线用户监听器

public class OnlineUserListener implements HttpSessionAttributeListener, HttpSessionListener {
    
    /**
     * 在线用户列表
     */
    private static List onlineUsers = new ArrayList();
    
    /**
     * 获取在线用户列表
     * @return
     */
    public static List getOnlineUsers(){
        return onlineUsers;
    }

    /* 
     * session 属性添加时(即首次执行setAttribute时)触发
     */
    public void attributeAdded(HttpSessionBindingEvent event) {
        if(event.getSession()==null){
            return;
        }
        // 当执行setAttribute("logonUserView",logonUserView)时
        // 将当前用户添加到在线用户列表中
        if(event.getName().equalsIgnoreCase("logonUserView")){
            // 获取当前登陆用户信息及session
            LogonUserView user = (LogonUserView)event.getValue();
            HttpSession session = event.getSession();
            
            // 创建在线用户信息对象
            OnlineUserView onlineUserView = new OnlineUserView();
            onlineUserView.setLoginIP(user.getLoginIP());
            onlineUserView.setUserId(user.getUserfullid());
            onlineUserView.setUserName(user.getUsername());
            onlineUserView.setUserSession(session);
            
            // 添加到在线用户列表
            onlineUsers.add(onlineUserView);
        }
    }

    /* 
     * session 属性移除时(即执行removeAttribute时)触发
     */
    public void attributeRemoved(HttpSessionBindingEvent event) {
    }

    /* 
     * session 属性更新时(即再次执行setAttribute时)触发
     */
    public void attributeReplaced(HttpSessionBindingEvent event) {
        if(event.getSession()==null){
            return;
        }

        // 当执行再次执行setAttribute("logonUserView")时,发生用户替换
        if(event.getName().equalsIgnoreCase("logonUserView")){
            // 获取被替换用户信息及session
            LogonUserView user = (LogonUserView)event.getValue();
            // 更新在线用户信息
            HttpSession session = event.getSession();
            // 获取当前登陆用户信息
            LogonUserView newUser = (LogonUserView)session.getAttribute("logonUserView");
            // 循环查找被替换用户在线信息
            for(int i=0;i<onlineUsers.size();i++){
                OnlineUserView onlineUserView = (OnlineUserView)onlineUsers.get(i);
                if(onlineUserView.getUserId().equals(user.getUserfullid())){
                    // 更新在线用户信息
                    onlineUserView.setLoginIP(newUser.getLoginIP());
                    onlineUserView.setUserId(newUser.getUserfullid());
                    onlineUserView.setUserName(newUser.getUsername());                    
                    break;
                }
            }
        }
    }

    /* 
     * session 创建时触发
     */
    public void sessionCreated(HttpSessionEvent event) {
    }

    /* 
     * session 销毁时(即用户注销、session超时时)触发
     */
    public void sessionDestroyed(HttpSessionEvent event) {
        if(event.getSession()==null){
            System.out.println("OnlineUserListener.sessionDestroyed() session==null");
            return;
        }
        // 获取当前登陆用户信息及session
        HttpSession session = event.getSession();
        for(int i=0; i<onlineUsers.size();i++){
            OnlineUserView onlineUserView = (OnlineUserView)onlineUsers.get(i);
            if(onlineUserView!=null && onlineUserView.getUserSession()!=null && session!=null 
                && onlineUserView.getUserSession().getId().equals(session.getId())){
                // 从在线用户列表移除用户
                onlineUsers.remove(onlineUserView);
                break;
            }
        }
    }
}
说明:
该统计方法在集群环境下无法使用,集群环境可以将在线用户信息存入数据库,各服务器连接统一数据库


scala实战之spark用户在线时长和登录次数统计实例 接触spark后就开始学习scala语言了,因为有一点python和java的基础学习起来还行,今天在这里把我工作中应用scala编程统计分析用户行为日志的实例和大家分析一下,我这里主要讲一下用户在线时长统计登录次数统计算法实现过程。 阅读详情

相关推荐

统计在线登录用户数量并获取客户端IP(涉及HttpSessionListener监听)

项目需要做一个统计在线登陆用户数量的功能。 首先我想到的是写HttpSessionListener监听,根据session来确定用户数量。     步骤: web.xml配置HttpSessionListener监听 org.hd.base.listener.HDSessionListener 监听的类: package org.hd.base.listener;

7922

统计网站浏览次数以及记录用户上次登陆的时间以及更新

该文件是通过Java语言实现的在JSP页面上显示出用户上次登陆的时间以及更新它为此次的最新时间的源码,利用了MVC2模式。望大家支持。。。。。

网站注册和登录个人信息

这是javaee文件,一般学习计算机的同学们大二下半年会用到!

CSDN登录入口

https://www.csdn.net/

asd412031739的博客 10万+

CSDN博客登录

CNDS博客 https://passport.csdn.net/account/login

qq_41172122的博客 1万+

csdn 登陆入口

csdn登陆入口 https://passport.csdn.net/login?code=public 刚刚百度CSDN登陆 居然找不到入口

Purplekate的博客 7万+

CSDN博客个人账号注册与登录

CSDN博客个人账号注册与登录

weixin_42289020的博客 8289

官网入口

如手机遇到加载速度过慢,点击右上角选择"在浏览器中打开"进入,建议复制地址(或域名:www.code2trade.cn)在电脑端打开;

qq_20237377的博客 1万+

用户在线登录时长统计

突然接到个任务,让统计用户连续在线的时长,写个简单的脚本来做个记录:

日拱一兵 2万+

跟我一起学Spark之——用户在线时长和登录次数统计

package 用户在线时长和登录次数统计 /** * Created by zhoubh on 2016/6/28. */ import java.text.SimpleDateFormat import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} import scala.uti...

SunWuKong_Hadoop的博客 1725

java统计用户在线时间,JAVA-用户是否在线-是不是登录-在线统计等方法

JAVA-用户是否在线-是否登录-在线统计等方法SessionListenerpackage com.oddel.listener;import javax.servlet.ServletContext;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.serv...

weixin_34163098的博客 1353

数据处理三之 用户在线时长和登录次数统计

数据 2016-04-18 16:00:00 {“areacode”:”浙江省丽水市”,”countAll”:0,”countCorrect”:0,”datatime”:”4134362”,”logid”:”201604181600001184409476”,”requestinfo”:”{\”sign\”:\”4\”,\”timestamp\”:\”1460966390499\”,\”rema

AngellYue的博客 2663

.net C# 利用session控制用户重复登录统计在线用户数解决方案

近期做了个网站要求防止用户重复登录,及统计在线用户数量。在网上查了些资料,给出如下解决方案。经实际运行效果很好,整理例程上传。 例程详见:http://download.csdn.net/detail/jlclyx/3793413 例程功能:能够基本准确的统计在线人数,误差为1分钟(session失效时间为1分钟)。                    能够在用户直接关闭页面一分钟后(未注

jlclyx的专栏 5376

在线用户信息统计&单用户登录

前言: web开发中,有时我们需要统计在线用户信息及实现单用户登录功能,具体实现如下。概述: 用户登录成功后,存放到session中,创建监听器监听session状态,及时更新存放登录用户信息的Vector,再通过对比Vector中用户信息实现单用户登录。设计思路: 1、创建单类,记录登录用户的基本信息,如用户名、登录时间等;public class User{

搬砖汉的博客 2211

统计在线用户数以及同账号登录踢出另一用户

参考博客:http://blog.csdn.net/licheng989/article/details/51579979 思路:写一个session属性监听器(SessionListener),实现HttpSessionAttributeListener接口,定义两个map,一个(key=username,value=session);另一个(key=username,value=user)。

qq_34721505的博客 1246

巧用session机制实现用户不重复登录、记录用户登录日志、统计在线人数

HttpSessionBindingListener 这个具体的使用文档自查,本篇中是新建了一个类实现本接口 public class UsersOnlineCountListener implements HttpSessionBindingListener { private User user; public User getUser() { ...

Red's blog 3324

统计用户在线登录人数

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33953384的博客 1208

asp 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统

asp 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统 connAccess.asp文件   dim strconn   Set con=Server.CreateObject("ADODB.Connection")   strconn="Provider=Microsoft.Jet.OLEDB.4.0;Data Sourc

qianjin_40的博客 878
上一篇: 静态压缩
下一篇: MD5加密算法
zh2qiang
博客等级 码龄20年 23粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值