JavaWeb Listener之HttpSessionBindListener

 

HttpSessionBindListener        监听把自身这个对象绑定到HttpSession对象上、解绑

 

绑定到HttpSession对象上,其实就是调用session的setAttribute()方法把一个HttpSessionBindListener对象放进去。

解绑就是调用session的removeAttribute()方法把HttpSessionListener对象移除。

 

 

HttpSessionBindListener这个监听器比较特殊,其他监听器都是注册后就监听了,而且是一对多监听所有的;

HttpSessionBindListener是注册后,还需要使用session.setAttribute(" " , HttpSessionBindListener对象),将HttpSessionBindListener对象放到某个session中,此HttpSessionBindListener对象才会监听,而且只会监听所在的session。一般一个HttpSessionBindListener只放到一个session中,所以一般是一对一监听的。

 

@WebListener()
public class MyListener implements HttpSessionBindListener{
    public void valueBound(HttpSessionBindingEvent event) {

    }

    public void valueUnbound(HttpSessionBindingEvent event) {

    }
}

JavaWeb中的8个监听器都是接口,不能直接new,需要先实现。

 

 

 

 

 HttpSession session = request.getSession();
        MyListener myListener = new MyListener();
        session.setAttribute("listener",myListener);
    session.removeAttribute("listener");

 

 

 session.setAttribute("listener",myListener);     

把我(myListener)放到某个session中了,我开始监听这个session的HttpSessionBindListener对象的添加、移除事件,我自己的添加、移除也算。

 

 

 

 


 

 

 

统计在线人数

有3种方式。

我们在ServletContext(application域)中设置count参数来记录在线人数。

 

看怎么理解“在线“这个概念了。

如果正在浏览本站的页面,不管有没有登录,就算是在线,可以使用(1)。

 

(1)使用HttpSessionListener监听session的创建、销毁

一个在线用户对应一个Session,统计在线人数,只需统计服务器上session对象的数量。

@WebListener()
public class MyListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        //count++;
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        //count--
    }
}        

 

将session超时时间设置小些,因为默认30min,用户离开后30min这段时间内也算在在线,这样统计的误差略大。

超时时间太小,session频繁销毁、新建,又会增加服务器负担,且新建Session也会有时间开销。

一般人工客服超时时间是2min。

 

 

 

如果在线是指处于登录状态,那上面这种方式就不可行。因为访问本站就会创建session,不需要登录;登出后也可以继续访问、浏览本站的页面,session仍然保留。

这就需要使用(2)、(3)了。

 

(2)登录时获取ServletContext中的count,+1,登出时-1。

 

(3)利用HttpSessionBindListener,登录时绑定一个HttpSessionBindListener对象到session中,登出时从session中移出这个HttpSessionBindListener对象。

@WebListener()
public class MyListener implements HttpSessionBindListener{
    public void valueBound(HttpSessionBindingEvent event) {
         //count++
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
          //count--
    }
}    

 

 

(2)、(3)其实是一样的,都是在用户登录、登出时记录一下,只是实现统计功能的代码所写位置不同,一个写在Servlet中,一个写在Listener中。

 

posted @ 2019-08-30 20:30  chy_18883701161  阅读(451)  评论(0编辑  收藏  举报