Servlet 监听器----Session

来源:互联网 发布:java葵花宝典2017 编辑:程序博客网 时间:2024/06/04 18:50

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绑定或取消绑定时,就会在控制台输出相关内容。

原创粉丝点击