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

公司有一个需求,就是统计当前在线的用户数量,查看前人的经验,如果是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的配置文件没有配置了。

经验分享 程序员 微信小程序 职场和发展