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