1、HttpSessionListener
public void sessionCreated(HttpSessionEvent se)
public void sessionDestroyed(HttpSessionEvent se)
这个监听器可以监听一个session对象的建立与失效,从方法的名字中可以很容易的看出
。例:
public class MySessionListener implements HttpSessionListerner {
public void sessionCreated(HttpSessionEvent se){
HttpSession session = se.getSession();
System.out.println(“session已经建立,id号是”+session.getId());
}
public void sessionDestroyed(HttpSessionEvent se){
System.out.println(“id号是”+session.getId()+”即将失效”);
}
}
然后不要忘记了在web.xml文件中部署该监听器,如下:
<listener>
<listener-class>xx.MySessionListener</listener-class>
</listener>
2、HttpSessionAttributeListener
public void attributeAdded(HttpSessionBindingEvent se)
public void attributeRemoved(HttpSessionBindingEvent se)
public void attributeReplaced(HttpSessionBindingEvent se)
这个监听器可以监听session中的属性被添加,修改、或删除。
session.setAttribute("zhangsan","12345");
session.setAttribute("zhangsan","67890");
public void attributeReplaced(HttpSessionBindingEvent se){
String name = se.getName();//"zhangsan"
String oldValue = se.getValue();//"12345"
String newValue = (String)(se.getSession().getAttribute(name));//"67890"
}
3、HttpSessionBindingListener
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
这个监听器可以监听session中的属性被添加,或删除。与
HttpSessionAttributeListener不同的是它要求添加的属性要实现该接口,并且不需要
在web.xml文件中部署,如以下代码:
session.setAttribute(“zh”,new User(“zhangsan”));
Session.removeAttribute(“zh”);
public class User implements HttpSessionBindingListener {
private String name;
public User(String name) {
this.name = name;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("绑定了属性"+arg0.getName()+":"+arg0.getValue
().toString());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("解除了属性"+arg0.getName());
}
public String toString() {
return this.name;
}
}
4、HttpSessionActivationListener
这个监听器也是由属性类来实现的,但它不是监听属性被添加或解除,而是监听session
对象被钝化或激活。那么什么是钝化呢?钝化就是将session对象的状态序列化成字节码
的形式,然后把这些字节码存储到硬盘上或通过网络将这些字节码传送到另外一个虚拟
机中(Java中将这一机制成为序列化)。激活就是将这些字节码恢复成对象当初的状态
的过程(反序列化)。为什么需要钝化和激活呢?一个Web服务器可以将一个session的
状态通过钝化的形式将状态保存到硬盘上,这样就能够为更多的用户提供服务,当这个
用户又需要这个session对象的时候再通过激活就可以恢复这个session的状态了。当有
多个Web服务器的时候,服务器通过负载均衡有可能将session对象的状态从一个虚拟机
传送到另外一个虚拟机,此时在一个虚拟机上钝化该session对象,而在另外一个虚拟机
上激活该对象。需要注意的是钝化和激活是需要时间的,会对你的程序性能有影响。钝
化和激活是服务器做的事情,你不能在你的程序中对session对象进行钝化,比如: 在
Tomcat6.0.14上测试
ObjectOutputStream oos = ….;
oos.writeObject(session);
会抛出一个NotSerializableException,说StandardSessionFacade不能被序列化。
查看HttpSesion接口的定义可以看到,该接口并没有继承Serializable接口(一个对象
要想能够序列化,该对象的类必须实现Serializable接口),所以HttpSesison的具体实
现类不能被序列化也不足奇怪。但是通过查看Tomcat 的源代码可以知道,
StandardSessionFacade这个类封装了StandardSession这个实现,它是实现了
Serializable接口。其实有经验的人,一看到Facade这个词其实就差不多能猜到了。下
面写个简单的代码:
public class User implements HttpSessionActivationListener
{
private String name;
public User(String name) {
this.name = name;
}
public void sessionWillPassivate(HttpSessionEvent se){
System.out.println(“session将要被钝化”);
}
public void sessionDidActivate(HttpSessionEvent se)
System.out.println(“session已被激活”);
}
public String toString() {
return this.name;
}
}
session.setAttribute(“zh”,new User(zhangsan));
这样当session被钝化或者被激活的时候都会通知User类对象并调用
sessionWillPassivate或者sessionDidActivate方法。注意:session被钝化或者被激活
只会通知它里面的属性。像上例如果User类即使实现了HttpSessionActivationListener
接口,而最终没有将此类对象放入session中,那么session被钝化或者激活也不会调用
该方法的。同HttpSessionBindingListener监听器一样该监听器也不需要在web.xml文件
中部署。