Servlet里面一共有八个监听, 其中有四个是session的监听接口与之关联的两个session事件,
这四个接口分别是:
HttpSessionAttributeListener and HttpSessionBindingEvent
HttpSessionBindingListener and HttpSessionBindingEvent
HttpSessionListener and HttpSessionEvent
HttpSessionActivationListener and HttpSessionEvent
HttpSessionAttributeListener: 用来监听session中的属性添加, 替换和删除,
只需创建一个类来实现HttpSessionAttributeListener接口, 然后在web.xml配个listener属性,其中litener-class是这
个类的路径. 该类会实现HttpSessionAttributeListener的三个方法. 分别对应session中的属性添加, 替换和删除. 该
类无需我们实例化使用, 因为servlet容器会创建该类的一个实例, 并是单例. 所以访问该系统的所有用户对session属
性的操作都会被HttpSessionAttributeListener监听到. HttpSessionBindingEvent事件的触发对象是任何object的实例, 因为session的setAttribute方法中可以存放任何object的实例。
HttpSessionBindingListener: 创建实现HttpSessionBindingListener接口的类, 不需在web.xml中配置, 该类会实现
HttpSessionBindingListener的两个方法valueBound()和valueUnbound(), 该类需要实例化使用, 将该类实例对象放
入session后会马上触发valueBound()方法, 从session中remove掉该实例时或session超时会马上触发
valueUnbound(), 很显然每个servlet都会创建一个该类的对象,所以多用户并发调用时它们都是相互独立的, 而且可
以创建多个实现HttpSessionBindingListener接口的类, 效果依然一样。
HttpSessionBindingEvent事件的触发对象是该类的实例本身(有点绕口),
举例
public class SessionListener implements HttpSessionBindingListener....
SessionListener sessionListener = new SessionListener();
//下面这句即是触发HttpSessionBindingEvent事件, 而触发对象正是sessionListener, 监听器的实例本身
request.getSession().setAttribute(request.getSession().getId(), sessionListener);
HttpSessionListener:监听session的创建和释放, 需在web.xml中配置, 重写sessionCreated()和
sessionDestroyed()方法, 它同样是容器创建的单列对象, 可以监听所有用户的session创建, 适合来做统计, 得注意
的一点是, 在浏览器访问服务器时, session的会话就创建了, 而session释放后才会调用sessionDestroyed()方法,
所以不能在sessionDestroyed()内做session清理工作, 因为已经无法获得session了。
HttpSessionActivationListener:当session在分布式环境中跨JVM时,实现该接口的对象得到通知,
需实行的方法sessionDidActivate()和sessionWillPassivate(), Activate与Passivate是用于置换对象的动作,当
session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的
动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容易理
解的,sessionDidActivate()与 sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。
这四个都与session有关,但能做到验证登录的只有HttpSessionBindingListener and
HttpSessionListener , 无疑使用前者更合适些。
这四个接口分别是:
HttpSessionAttributeListener and HttpSessionBindingEvent
HttpSessionBindingListener and HttpSessionBindingEvent
HttpSessionListener and HttpSessionEvent
HttpSessionActivationListener and HttpSessionEvent
HttpSessionAttributeListener: 用来监听session中的属性添加, 替换和删除,
只需创建一个类来实现HttpSessionAttributeListener接口, 然后在web.xml配个listener属性,其中litener-class是这
个类的路径. 该类会实现HttpSessionAttributeListener的三个方法. 分别对应session中的属性添加, 替换和删除. 该
类无需我们实例化使用, 因为servlet容器会创建该类的一个实例, 并是单例. 所以访问该系统的所有用户对session属
性的操作都会被HttpSessionAttributeListener监听到. HttpSessionBindingEvent事件的触发对象是任何object的实例, 因为session的setAttribute方法中可以存放任何object的实例。
HttpSessionBindingListener: 创建实现HttpSessionBindingListener接口的类, 不需在web.xml中配置, 该类会实现
HttpSessionBindingListener的两个方法valueBound()和valueUnbound(), 该类需要实例化使用, 将该类实例对象放
入session后会马上触发valueBound()方法, 从session中remove掉该实例时或session超时会马上触发
valueUnbound(), 很显然每个servlet都会创建一个该类的对象,所以多用户并发调用时它们都是相互独立的, 而且可
以创建多个实现HttpSessionBindingListener接口的类, 效果依然一样。
HttpSessionBindingEvent事件的触发对象是该类的实例本身(有点绕口),
举例
public class SessionListener implements HttpSessionBindingListener....
SessionListener sessionListener = new SessionListener();
//下面这句即是触发HttpSessionBindingEvent事件, 而触发对象正是sessionListener, 监听器的实例本身
request.getSession().setAttribute(request.getSession().getId(), sessionListener);
HttpSessionListener:监听session的创建和释放, 需在web.xml中配置, 重写sessionCreated()和
sessionDestroyed()方法, 它同样是容器创建的单列对象, 可以监听所有用户的session创建, 适合来做统计, 得注意
的一点是, 在浏览器访问服务器时, session的会话就创建了, 而session释放后才会调用sessionDestroyed()方法,
所以不能在sessionDestroyed()内做session清理工作, 因为已经无法获得session了。
HttpSessionActivationListener:当session在分布式环境中跨JVM时,实现该接口的对象得到通知,
需实行的方法sessionDidActivate()和sessionWillPassivate(), Activate与Passivate是用于置换对象的动作,当
session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的
动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容易理
解的,sessionDidActivate()与 sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。
这四个都与session有关,但能做到验证登录的只有HttpSessionBindingListener and
HttpSessionListener , 无疑使用前者更合适些。