HttpSessionBindingListener

[该文章转载至:http://blog.sina.com.cn/s/blog_4dacfb010100qxf8.html]

首先我在网上查了一下session的真正销毁条件:

1调用 session.invalidate();方法

2 session到了设置或者默认的超时时间,自动销毁(关闭浏览器此session还未销毁,只是不能再用了);

明白了上面的两条就可以去研究一下HttpSessionBindingListener这种session监听了。

新建一个类,继承HttpSessionBindingListener,实现了两个方法,分别是:

valueBound()和valueUnbound(),这个类按照通俗的理解就是对session绑定对象(setAttribute)过程的一种监听类型,它不需要配置xml文件,只是将实例化的HttpSessionBindingListener对象setAttribute到session里面就可以对HttpSessionBindingListener对象对象进行监听了,其实也就是对HttpSessionBindingListener对象所对应的session进行监听,还可以记录该session的具体信息(例如会员的登录信息)。

valueBound是在setAttribute时触发

valueUnbound则是在session销毁时触发。^-^(什么时候销毁上文有提到)

做出这样的一个例子:

新建一个继承自HttpSessionBindingListener的类UsersOnlineCountListener

 

  1. public class UsersOnlineCountListener implements HttpSessionBindingListener {  
  2. int uid;  
  3. public int getUid() {  
  4.    return uid;  
  5. }  
  6. public void setUid(int uid) {  
  7.    this.uid = uid;  
  8. }  
  9. public void valueBound(HttpSessionBindingEvent arg0) {  
  10.     System.out.println(uid+"登录了"+new Date());  
  11. }  
  12. public void valueUnbound(HttpSessionBindingEvent arg0) {  
  13.    System.out.println(uid+"下线了"+new Date());  
  14. }  
  15. }  
public class UsersOnlineCountListener implements HttpSessionBindingListener {
int uid;
public int getUid() {
   return uid;
}
public void setUid(int uid) {
   this.uid = uid;
}
public void valueBound(HttpSessionBindingEvent arg0) {
    System.out.println(uid+"登录了"+new Date());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
   System.out.println(uid+"下线了"+new Date());
}
}

 

会员登录成功的时候,代码中加上:

 

  1. UsersOnlineCountListener uocl = new UsersOnlineCountListener();  
  2. uocl.setUid(obj.getUid());  
  3. session.setAttribute("uocl", uocl);//这个时候要触发valueBound方法了  
UsersOnlineCountListener uocl = new UsersOnlineCountListener();
uocl.setUid(obj.getUid());
session.setAttribute("uocl", uocl);//这个时候要触发valueBound方法了

 

控制台输出:

11登录了Mon Sep 20 02:09:37 CST 2010

点击注销的时候,session销毁,触发valueUnbound

控制台输出:

11下线了Mon Sep 20 02:10:22 CST 2010

如果直接关闭浏览器,控制台不会立刻输出"11下线了Mon Sep 20 02:40:13 CST 2010"

大约30分钟后(session的自动销毁时间,可以设定)

控制台输出:

11下线了Mon Sep 20 02:40:13 CST 2010

这里总结下:valueUnbound方法将被以下任一条件触发

a. 执行session.setAttribute("uocl", 非uocl对象) 时。
b. 执行session.removeAttribute("uocl") 时。
c. 执行session.invalidate()时。
d. session超时后。

posted @ 2015-11-01 20:47  TTff  阅读(335)  评论(0编辑  收藏  举报