记录一次统计网站在线人数的经历

公司有一个需求,就是统计当前在线的用户数量,查看前人的经验,如果是servlet 3.0及以上的话可以直接使用注解的方式(@WebListener),代码可以如下:

@WebListener
public class MySessionListener implements HttpSessionListener {
//监听到session创建时+1
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        //获取Application对象
        ServletContext sc = httpSessionEvent.getSession().getServletContext();
        //获取application对象中当前的在线人数
        Object count = sc.getAttribute("count");
        //判断
        if(count!=null){
            int c=(int)count;
            sc.setAttribute("count",c+1);
        }else{
//为空直接赋值为1
            sc.setAttribute("count",1);
        }
    }

//监听到session失效-1
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        //获取Application对象
        ServletContext sc = httpSessionEvent.getSession().getServletContext();
        //获取application对象中当前的在线人数
        int count = (int) sc.getAttribute("count");
        sc.setAttribute("count",count-1);
    }
}

然后在登录代码的session中获取当前session的ServletContext中的count值,

ServletContext sc = curSession.getServletContext();

int  count = 1;

if(sc.getAttribute("count")!=null){
    count = sc.getAttribute("count");
}

//把count 返回给js端,然后html取出来显示出来(这是公司目前的解决办法)

然后在js端获取count的值,显示到html中。

代码写完了,本地确实是可以的,但是遇到了两个问题,一个是偶尔会出现为空的情况,导致获取count属性时为空(第二个代码段中的if是解决的办法)。

 

还有一个就是发现,servlet应用的是tomcat的jar包,但是公司的项目前台用的是IBM的Websphere,所以导致了一个巨大的 问题:

本地的Tomcat启动后是可以统计在线人数的,但是一到服务器就有问题了,然后发现了直接注册Listener的方法,直接在web.xml(执行顺序context-param -> listener -> filter -> servlet )中注册了Listener:

<listener>  
        <listener-class>  
            com.icbc.aladdin.listener.MySessionListener
        </listener-class>  
    </listener> 

最后发现还是失效,以为是加载顺序的问题,最后发现是还有一个web_merged.xml的配置文件没有配置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值