Servlet 监听器----Session
Session 监听器
有四个监听器接口与HttpSession有关,分别为:
HttpSessionListener
HttpSessionActivationListener
HttpSessionAttributeListener
HttpSessionBindingListener
1. HttpSessionListener
当HttpSession被创建或者被销毁时,Servlet容器就会调用所有已经注册的HttpSessionListener。
例子
java代码
public class SessionListener implements HttpSessionListener,ServletContextListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
ServletContext servletContext = session.getServletContext();
//AtomicInteger是在使用非阻塞算法实现并发控制
AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
int userCount = userCounter.decrementAndGet();
System.out.println("userCount decreamented to:"+userCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
ServletContext servletContext = session.getServletContext();
AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
int userCount = userCounter.decrementAndGet();
System.out.println("----------------userCount decreamented to:"+userCount);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("userCounter", new AtomicInteger());
}
可以看见,SessionListener实现了两个接口。
其中AtomicInteger的初始值为0,表示用户刚启动时的用户数为0,
其对象以原子方式将此更新器管理的给定对象的字段的当前值减 1。
将该监听器注册到部署,访问界面,可以看到控制台输出
从同一个浏览器再次发出请求时,userCounter的值不会发生变化,因为它与同一个HttpSession关联。但是使用不同浏览器访问时,这个值就会增加,值得注意的是:销毁HttpSession之前调用sessionDestroyed方法,它的userCounter值是递减的。
2. HttpSessionActivationListener
每当HttpSession中添加,删除或替换了某个属性时,ServletContextAttributeListener的实现都会收到通知,
该监听器接口种有三个方法:
void attributeAdded(HttpSessionBindingEvent event)
void attributeRemoveed(HttpSessionBindingEvent event)
void attributeReplaced(HttpSessionBindingEvent event)
获取属性名和属性值,使用以下两个方法
java.lang.String getName()
java.lang.Object getValue()
3.HttpSessionAttributeListener
在分布式环境中,多个Servlet会配置成可伸缩性的,为节省内存,Servlet可对session进行迁移或序列化,这个接口中有;两个方法
包含这个对象的HttpSession被**就调用:
void sessionDidActivate(HttpSessionEvent event)
包含这个对象的HttpSession被钝化就调用:
void sessionWillPassivate(HttpSessionEvent event)
4. HttpSessionBindingListener
当HttpSessionBindingListener绑定到HttpSession或者取消绑定时,就会收到通知。
例子:
public class Banding implements HttpSessionBindingListener{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String attributeName = event.getName();
System.out.println(attributeName+" valueBinding");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String attributeName = event.getName();
System.out.println(attributeName+" valueUnBinding");
}
}
当监听器与HttpSession绑定或取消绑定时,就会在控制台输出相关内容。
上一篇: 二分查找的三种形式